Un guide rapide sur l'utilisation des services Web dans Groovy

1. Vue d'ensemble

De nos jours, nous voyons une gamme de façons d'exposer des données par une application sur le Web.

Souvent, l'application utilise un service Web SOAP ou REST pour exposer ses API. Cependant, il existe également des protocoles de streaming tels que RSS et Atom à prendre en compte.

Dans ce rapide didacticiel, nous explorerons quelques moyens pratiques de travailler avec les services Web dans Groovy pour chacun de ces protocoles.

2. Exécutez les requêtes HTTP

Pour commencer, exécutons une simple requête HTTP GET à l'aide de la classe URL . Nous consommerons les API Postman Echo lors de notre exploration.

Tout d'abord, nous allons appeler la méthode openConnection de la classe URL , puis définir la requestMethod sur GET:

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

De même, nous pouvons faire une requête POST en définissant requestMethod sur POST:

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

De plus, nous pouvons transmettre les paramètres à la requête POST à ​​l'aide de outputStream.withWriter :

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

Ici, Groovy avec fermeture semble assez pratique et rend le code plus propre.

Utilisons le JsonSlurper pour analyser la réponse String en JSON:

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

3. Flux RSS et Atom

Les flux RSS et Atom sont des moyens courants d'exposer les contenus tels que les actualités, les blogs et les forums techniques sur le Web.

En outre, les deux flux sont au format XML. Par conséquent, nous pouvons utiliser la classe XMLParser de Groovy pour analyser le contenu.

Lisons quelques articles de Google Actualités en utilisant leur flux RSS:

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

De même, nous pouvons lire les flux Atom. Cependant, en raison de la variation des spécifications des deux protocoles, nous accéderons au contenu différemment dans les flux Atom:

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

En outre, nous comprenons que Groovy prend en charge toutes les bibliothèques Java sont encouragées dans Groovy. Par conséquent, nous pouvons sûrement utiliser l'API de Rome pour lire les flux RSS.

4. Demande et réponse SOAP

SOAP est l'un des protocoles de service Web les plus utilisés par les applications pour exposer leurs services sur le Web.

Nous utiliserons la bibliothèque groovy-wslite pour consommer les API SOAP. Ajoutons sa dernière dépendance à notre pom.xml :

 com.github.groovy-wslite groovy-wslite 1.1.3 

Alternativement, nous pouvons ajouter la dernière dépendance en utilisant Gradle:

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

Ou si nous voulons écrire un script Groovy. Nous pouvons l'ajouter directement en utilisant @Grab :

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

La bibliothèque groovy-wslite fournit la classe SOAPClient pour communiquer avec les API SOAP . En même temps, il dispose de la classe SOAPMessageBuilder pour créer le message de demande.

Consommons un service SOAP de conversion de nombres en utilisant 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. Requête et réponse REST

REST est un autre style architectural populaire utilisé pour créer des services Web. En outre, les API sont exposées en fonction de méthodes HTTP telles que GET, POST, PUT et DELETE.

5.1. AVOIR

Nous utiliserons la bibliothèque groovy-wslite déjà décrite pour consommer les API REST. Il fournit la classe RESTClient pour une communication sans tracas .

Faisons une requête GET à l'API Postman déjà discutée:

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. PUBLIER

Now, let's make a POST request to the Postman API. At the same time, we'll pass the form parameters as 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 

Here, we've set the JSON as the default accept header.

6. Authentication for Web Service

With the growing amount of web services and applications communicating one with another, it's recommended to have a secure web service.

As a result, a combination of HTTPS and an authentication mechanism like Basic Auth and OAuth is important.

Therefore, an application must authenticate itself while consuming a web service API.

6.1. Basic Auth

We can use the already discussed RESTClient class. Let's use the HTTPBasicAuthorization class with credentials to perform a basic authentication:

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

Alternativement, nous pouvons passer directement les informations d'identification (encodées en Base64) dans le paramètre headers :

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

6.2. OAuth 1.0

De même, nous pouvons faire une requête OAuth 1.0 en passant les paramètres d'authentification tels que la clé du consommateur et le secret du consommateur.

Cependant, comme nous n'avons pas de support intégré pour OAuth 1.0 comme nous le faisons pour les autres mécanismes, nous devrons faire le travail nous-mêmes:

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. Conclusion

Dans ce didacticiel, nous avons exploré quelques méthodes pratiques pour travailler avec des services Web dans Groovy .

Dans le même temps, nous avons vu un moyen simple de lire un flux RSS ou Atom.

Comme d'habitude, les implémentations de code sont disponibles à l'adresse over sur GitHub.