Een beknopte handleiding voor het werken met webservices in Groovy

1. Overzicht

Tegenwoordig zien we een reeks manieren om gegevens door een applicatie via het web openbaar te maken.

Vaak gebruikt de applicatie een SOAP- of REST-webservice om hun API's bloot te leggen. Er zijn echter ook streamingprotocollen zoals RSS en Atom om te overwegen.

In deze korte tutorial onderzoeken we een paar handige manieren om met webservices in Groovy te werken voor elk van deze protocollen.

2. Voer HTTP-verzoeken uit

Laten we om te beginnen een eenvoudig HTTP GET-verzoek uitvoeren met behulp van de URL klasse. We gebruiken de Postman Echo-API's tijdens onze verkenning.

Eerst bellen we het openConnection methode van de URL class en stel vervolgens het requestMethod krijgen:

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

Evenzo kunnen we een POST-verzoek doen door de requestMethod posten:

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

We kunnen de parameters ook doorgeven aan het POST-verzoek met behulp van de outputStream.withWriter:

def form = "param1 = Dit is een verzoekparameter." postConnection.doOutput = true def tekst postConnection.with {outputStream.withWriter {outputStreamWriter -> outputStreamWriter << form} text = content.text} beweren postConnection.responseCode == 200

Hier, Groovy's met sluiting ziet er best handig uit en maakt de code schoner.

Laten we de JsonSlurper om het Draad reactie in JSON:

JsonSlurper jsonSlurper = nieuwe JsonSlurper () assert jsonSlurper.parseText (tekst) ?. json.param1 == "Dit is een verzoekparameter."

3. RSS- en Atom-feeds

RSS- en Atom-feed zijn veelgebruikte manieren om de inhoud, zoals nieuws, blogs en technische forums, via internet te tonen.

Beide feeds zijn ook in XML-indeling. Daarom kunnen we Groovy's gebruiken XMLParser class om de inhoud te ontleden.

Laten we een paar topverhalen van Google Nieuws lezen met behulp van hun RSS-feed:

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

Evenzo kunnen we de Atom-feeds lezen. Vanwege de variatie in specificaties van beide protocollen zullen we de inhoud echter anders benaderen in Atom-feeds:

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

We begrijpen ook dat Groovy ondersteunt dat alle Java-bibliotheken worden aangemoedigd in Groovy. Daarom kunnen we zeker de Rome API gebruiken om de RSS-feeds te lezen.

4. SOAP-verzoek en reactie

SOAP is een van de meest populaire webserviceprotocollen die door applicaties worden gebruikt om hun services via internet bekend te maken.

We gebruiken de groovy-wslite-bibliotheek om de SOAP-API's te gebruiken. Laten we de nieuwste afhankelijkheid toevoegen aan onze pom.xml:

 com.github.groovy-wslite groovy-wslite 1.1.3 

Als alternatief kunnen we de nieuwste afhankelijkheid toevoegen met Gradle:

compileer groep: 'com.github.groovy-wslite', naam: 'groovy-wslite', versie: '1.1.3'

Of als we een Groovy-script willen schrijven. We kunnen het direct toevoegen met @Grab:

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

De groovy-wslite-bibliotheek biedt de SOAPClient klasse om te communiceren met SOAP-API's. Tegelijkertijd heeft het de SOAPMessageBuilder class om het verzoekbericht te maken.

Laten we een SOAP-service voor nummerconversie gebruiken met behulp van de SOAPClient:

def url = "//www.dataaccess.com/webservicesserver/numberconversion.wso" def soapClient = nieuwe SOAPClient (url) def bericht = nieuwe SOAPMessageBuilder (). build ({body {NumberToWords (xmlns: "//www.dataaccess. com / webservicesserver / ") {ubiNum (123)}}}) def response = soapClient.send (message.toString ()); def words = response.NumberToWordsResponse assert words == "honderd drieëntwintig"

5. REST-verzoek en reactie

REST is een andere populaire bouwstijl die wordt gebruikt voor het maken van webservices. De API's worden ook weergegeven op basis van HTTP-methoden zoals GET, POST, PUT en DELETE.

5.1. KRIJGEN

We zullen de al besproken groovy-wslite-bibliotheek gebruiken om de REST API's te gebruiken. Het biedt de RESTClient klasse voor probleemloze communicatie.

Laten we een GET-verzoek doen naar de al besproken Postman API:

RESTClient client = nieuwe RESTClient ("// postman-echo.com") def path = "/ get" def antwoord probeer {response = client.get (pad: pad) assert response.statusCode = 200 assert response.json? .Headers ? .host == "postman-echo.com"} catch (RESTClientException e) {beweren e? .response? .statusCode! = 200}

5.2. POST

Laten we nu een POST-verzoek indienen bij de Postman API. Tegelijkertijd geven we de formulierparameters door 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 hebben we de JSON ingesteld als de standaard accept-header.

6. Authenticatie voor webservice

Met het groeiende aantal webservices en applicaties die met elkaar communiceren, wordt het aanbevolen om een ​​veilige webservice te hebben.

Als resultaat, een combinatie van HTTPS en een authenticatiemechanisme zoals Basic Auth en OAuth is belangrijk.

Daarom moet een applicatie zichzelf verifiëren tijdens het gebruik van een webservice-API.

6.1. Basis Auth

We kunnen de reeds besproken gebruiken RESTClient klasse. Laten we de HTTPBasicAuthorization klasse met inloggegevens om een ​​basisverificatie uit te voeren:

def path = "/ basic-auth" client.authorization = nieuwe HTTPBasicAuthorization ("postbode", "wachtwoord") response = client.get (pad: pad) assert response.statusCode == 200 assert response.json? .authenticated == waar

Als alternatief kunnen we de inloggegevens (Base64-gecodeerd) rechtstreeks doorgeven in het headers parameter:

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

6.2. OAuth 1.0

Op dezelfde manier kunnen we een OAuth 1.0-verzoek doen door de auth-parameters zoals consumentensleutel en consumentengeheim door te geven.

Omdat we echter geen ingebouwde ondersteuning hebben voor OAuth 1.0 zoals we dat wel doen voor de andere mechanismen, zullen we het werk zelf moeten doen:

def path = "/ oauth1" def params = [oauth_consumer_key: "RKCGzna7bv9YD57c", oauth_signature_method: "HMAC-SHA1", oauth_timestamp: 1567089944, oauth_nonce: "URT7v4" def. = new RESTClient ("// postman-echo.com") .get (pad: pad, query: params) assert response.statusCode == 200 assert response.statusMessage == "OK" assert response.json.status == " voorbij lopen"

7. Conclusie

In deze zelfstudie hebben we een paar handige manieren onderzocht om werken met webservices in Groovy.

Tegelijkertijd hebben we een gemakkelijke manier gezien om een ​​RSS- of Atom-feed te lezen.

Zoals gewoonlijk zijn de code-implementaties beschikbaar op GitHub.