Eine Kurzanleitung zum Arbeiten mit Webdiensten in Groovy

1. Übersicht

Heutzutage sehen wir eine Reihe von Möglichkeiten, Daten von einer Anwendung über das Web verfügbar zu machen.

Häufig verwendet die Anwendung einen SOAP- oder REST-Webdienst, um ihre APIs verfügbar zu machen. Es sind jedoch auch Streaming-Protokolle wie RSS und Atom zu berücksichtigen.

In diesem kurzen Tutorial werden einige praktische Möglichkeiten für die Arbeit mit Webdiensten in Groovy für jedes dieser Protokolle erläutert.

2. Führen Sie HTTP-Anforderungen aus

Lassen Sie uns zunächst eine einfache HTTP-GET-Anforderung mithilfe der URL- Klasse ausführen . Wir werden die Postman Echo APIs während unserer Erkundung verwenden.

Zuerst rufen wir die openConnection- Methode der URL- Klasse auf und setzen dann die requestMethod auf GET:

def postmanGet = new URL('//postman-echo.com/get') def getConnection = postmanGet.openConnection() getConnection.requestMethod = 'GET' assert getConnection.responseCode == 200

Ebenso können wir eine POST-Anfrage stellen, indem wir die requestMethod auf POST setzen:

def postmanPost = new URL('//postman-echo.com/post') def postConnection = postmanPost.openConnection() postConnection.requestMethod = 'POST' assert postConnection.responseCode == 200

Außerdem können wir die Parameter mithilfe von outputStream.withWriter an die POST-Anforderung übergeben :

def form = "param1=This is request parameter." postConnection.doOutput = true def text postConnection.with { outputStream.withWriter { outputStreamWriter -> outputStreamWriter << form } text = content.text } assert postConnection.responseCode == 200

Hier sieht Groovy's mit Verschluss sehr praktisch aus und macht den Code sauberer.

Verwenden wir den JsonSlurper , um die String- Antwort in JSON zu analysieren :

JsonSlurper jsonSlurper = new JsonSlurper() assert jsonSlurper.parseText(text)?.json.param1 == "This is request parameter."

3. RSS- und Atom-Feeds

RSS- und Atom-Feeds sind gängige Methoden, um Inhalte wie Nachrichten, Blogs und Tech-Foren über das Web verfügbar zu machen.

Außerdem sind beide Feeds XML-formatiert. Daher können wir die XMLParser- Klasse von Groovy verwenden , um den Inhalt zu analysieren.

Lesen wir ein paar Top-Storys aus den Google News mithilfe ihres RSS-Feeds:

def rssFeed = new XmlParser() .parse("//news.google.com/rss?hl=en-US&gl=US&ceid=US:en") def stories = [] (0..4).each { def item = rssFeed.channel.item.get(it) stories << item.title.text() } assert stories.size() == 5

Ebenso können wir die Atom-Feeds lesen. Aufgrund der unterschiedlichen Spezifikationen beider Protokolle greifen wir jedoch in Atom-Feeds unterschiedlich auf den Inhalt zu:

def atomFeed = new XmlParser() .parse("//news.google.com/atom?hl=en-US&gl=US&ceid=US:en") def stories = [] (0..4).each { def entry = atomFeed.entry.get(it) stories << entry.title.text() } assert stories.size() == 5

Wir wissen auch, dass Groovy alle Java-Bibliotheken unterstützt, die in Groovy empfohlen werden. Daher können wir sicherlich die Rom-API verwenden, um die RSS-Feeds zu lesen.

4. SOAP-Anforderung und Antwort

SOAP ist eines der beliebtesten Webdienstprotokolle, mit denen Anwendungen ihre Dienste über das Web verfügbar machen.

Wir werden die groovy-wslite-Bibliothek verwenden, um die SOAP-APIs zu verwenden. Fügen wir die neueste Abhängigkeit zu unserer pom.xml hinzu :

 com.github.groovy-wslite groovy-wslite 1.1.3 

Alternativ können wir die neueste Abhängigkeit mit Gradle hinzufügen:

compile group: 'com.github.groovy-wslite', name: 'groovy-wslite', version: '1.1.3'

Oder wenn wir ein Groovy-Skript schreiben wollen. Wir können es direkt mit @Grab hinzufügen :

@Grab(group='com.github.groovy-wslite', module="groovy-wslite", version="1.1.3")

Die groovy-wslite-Bibliothek bietet die SOAPClient- Klasse für die Kommunikation mit SOAP-APIs . Gleichzeitig verfügt es über die SOAPMessageBuilder- Klasse, um die Anforderungsnachricht zu erstellen.

Verwenden wir einen SOAP-Dienst zur Zahlenkonvertierung mit dem SOAPClient :

def url = "//www.dataaccess.com/webservicesserver/numberconversion.wso" def soapClient = new SOAPClient(url) def message = new SOAPMessageBuilder().build({ body { NumberToWords(xmlns: "//www.dataaccess.com/webservicesserver/") { ubiNum(123) } } }) def response = soapClient.send(message.toString()); def words = response.NumberToWordsResponse assert words == "one hundred and twenty three "

5. REST-Anforderung und Antwort

REST ist ein weiterer beliebter Architekturstil, der zum Erstellen von Webdiensten verwendet wird. Außerdem werden die APIs basierend auf HTTP-Methoden wie GET, POST, PUT und DELETE verfügbar gemacht.

5.1. BEKOMMEN

Wir werden die bereits diskutierte groovy-wslite-Bibliothek verwenden, um die REST-APIs zu verwenden. Es bietet die RESTClient- Klasse für problemlose Kommunikation .

Lassen Sie uns eine GET-Anfrage an die bereits diskutierte Postman-API stellen:

RESTClient client = new RESTClient("//postman-echo.com") def path = "/get" def response try { response = client.get(path: path) assert response.statusCode = 200 assert response.json?.headers?.host == "postman-echo.com" } catch (RESTClientException e) { assert e?.response?.statusCode != 200 }

5.2. POST

Lassen Sie uns nun eine POST-Anfrage an die Postman-API senden. Gleichzeitig übergeben wir die Formularparameter als JSON:

client.defaultAcceptHeader = ContentType.JSON def path = "/post" def params = ["foo":1,"bar":2] def response = client.post(path: path) { type ContentType.JSON json params } assert response.json?.data == params 

Hier haben wir den JSON als Standard-Accept-Header festgelegt.

6. Authentifizierung für den Webdienst

Angesichts der wachsenden Anzahl von Webdiensten und Anwendungen, die miteinander kommunizieren, wird ein sicherer Webdienst empfohlen.

Daher ist eine Kombination aus HTTPS und einem Authentifizierungsmechanismus wie Basic Auth und OAuth wichtig .

Daher muss sich eine Anwendung authentifizieren, während sie eine Webdienst-API verwendet.

6.1. Grundauth

Wir können die bereits diskutierte RESTClient- Klasse verwenden. Verwenden Sie die HTTPBasicAuthorization- Klasse mit Anmeldeinformationen, um eine grundlegende Authentifizierung durchzuführen:

def path = "/basic-auth" client.authorization = new HTTPBasicAuthorization("postman", "password") response = client.get(path: path) assert response.statusCode == 200 assert response.json?.authenticated == true

Alternativ können wir die Anmeldeinformationen (Base64-codiert) direkt im Header- Parameter übergeben:

def response = client .get(path: path, headers: ["Authorization": "Basic cG9zdG1hbjpwYXNzd29yZA=="])

6.2. OAuth 1.0

In ähnlicher Weise können wir eine OAuth 1.0-Anforderung stellen, die die Authentifizierungsparameter wie Consumer Key und Consumer Secret übergibt.

Da wir OAuth 1.0 jedoch nicht wie die anderen Mechanismen unterstützen, müssen wir die Arbeit selbst erledigen:

def path = "/oauth1" def params = [oauth_consumer_key: "RKCGzna7bv9YD57c", oauth_signature_method: "HMAC-SHA1", oauth_timestamp:1567089944, oauth_nonce: "URT7v4", oauth_version: 1.0, oauth_signature: 'RGgR/ktDmclkM0ISWaFzebtlO0A='] def response = new RESTClient("//postman-echo.com") .get(path: path, query: params) assert response.statusCode == 200 assert response.statusMessage == "OK" assert response.json.status == "pass"

7. Fazit

In diesem Tutorial haben wir einige praktische Möglichkeiten für die Arbeit mit Webdiensten in Groovy untersucht .

Gleichzeitig haben wir eine einfache Möglichkeit gesehen, einen RSS- oder Atom-Feed zu lesen.

Wie üblich sind die Code-Implementierungen auf GitHub verfügbar.