Una guida rapida per lavorare con i servizi Web in Groovy

1. Panoramica

Al giorno d'oggi, vediamo una serie di modi per esporre i dati da un'applicazione sul Web.

Spesso l'applicazione utilizza un servizio Web SOAP o REST per esporre le proprie API. Tuttavia, ci sono anche protocolli di streaming come RSS e Atom da considerare.

In questo breve tutorial, esploreremo alcuni modi pratici per lavorare con i servizi Web in Groovy per ciascuno di questi protocolli.

2. Eseguire le richieste HTTP

Per cominciare, eseguiamo una semplice richiesta HTTP GET utilizzando la classe URL . Consumeremo le API Postman Echo durante la nostra esplorazione.

Innanzitutto, chiameremo il metodo openConnection della classe URL e quindi imposteremo requestMethod su GET:

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

Allo stesso modo, possiamo fare una richiesta POST impostando requestMethod su POST:

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

Inoltre, possiamo passare i parametri alla richiesta POST utilizzando 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

Qui, Groovy con chiusura sembra abbastanza utile e rende il codice più pulito.

Usiamo JsonSlurper per analizzare la risposta della stringa in JSON:

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

3. Feed RSS e Atom

RSS e feed Atom sono modi comuni per esporre contenuti come notizie, blog e forum tecnologici sul web.

Inoltre, entrambi i feed sono in formato XML. Pertanto, possiamo utilizzare la classe XMLParser di Groovy per analizzare il contenuto.

Leggiamo alcune delle principali notizie di Google News utilizzando il loro feed 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

Allo stesso modo, possiamo leggere i feed Atom. Tuttavia, a causa della variazione delle specifiche di entrambi i protocolli, accediamo al contenuto in modo diverso nei feed 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

Inoltre, sappiamo che Groovy supporta tutte le librerie Java che sono incoraggiate in Groovy. Pertanto, possiamo sicuramente utilizzare l'API di Roma per leggere i feed RSS.

4. Richiesta e risposta SOAP

SOAP è uno dei protocolli di servizi Web più popolari utilizzati dalle applicazioni per esporre i propri servizi sul Web.

Useremo la libreria groovy-wslite per utilizzare le API SOAP. Aggiungiamo la sua ultima dipendenza al nostro pom.xml :

 com.github.groovy-wslite groovy-wslite 1.1.3 

In alternativa, possiamo aggiungere l'ultima dipendenza utilizzando Gradle:

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

O se vogliamo scrivere uno script Groovy. Possiamo aggiungerlo direttamente usando @Grab :

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

La libreria groovy-wslite fornisce la classe SOAPClient per comunicare con le API SOAP . Allo stesso tempo, ha la classe SOAPMessageBuilder per creare il messaggio di richiesta.

Consumiamo un servizio SOAP di conversione del numero utilizzando 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. Richiesta e risposta REST

REST è un altro stile architettonico popolare utilizzato per la creazione di servizi web. Inoltre, le API vengono esposte in base a metodi HTTP come GET, POST, PUT e DELETE.

5.1. OTTENERE

Useremo la già discussa libreria groovy-wslite per utilizzare le API REST. Fornisce la classe RESTClient per comunicazioni senza problemi .

Facciamo una richiesta GET alla già discussa API Postman:

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

Ora, facciamo una richiesta POST all'API di Postman. Allo stesso tempo, passeremo i parametri del modulo come 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 

Qui, abbiamo impostato JSON come intestazione di accettazione predefinita.

6. Autenticazione per il servizio Web

Con la crescente quantità di servizi Web e applicazioni che comunicano tra loro, è consigliabile disporre di un servizio Web sicuro.

Di conseguenza, è importante una combinazione di HTTPS e un meccanismo di autenticazione come Basic Auth e OAuth .

Pertanto, un'applicazione deve autenticarsi mentre utilizza un'API del servizio Web.

6.1. Autenticazione di base

Possiamo usare la classe RESTClient già discussa . Usiamo la classe HTTPBasicAuthorization con le credenziali per eseguire un'autenticazione di base:

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

In alternativa, possiamo passare direttamente le credenziali (codificate Base64) nel parametro headers :

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

6.2. OAuth 1.0

Allo stesso modo, possiamo effettuare una richiesta OAuth 1.0 passando i parametri di autenticazione come chiave utente e segreto utente.

Tuttavia, poiché non abbiamo il supporto integrato per OAuth 1.0 come facciamo per gli altri meccanismi, dovremo fare il lavoro da soli:

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

In questo tutorial, abbiamo esplorato alcuni modi pratici per lavorare con i servizi web in Groovy .

Allo stesso tempo, abbiamo visto un modo semplice per leggere un feed RSS o Atom.

Come al solito, le implementazioni del codice sono disponibili su GitHub.