En hurtig guide til arbejde med webservices i Groovy

1. Oversigt

I dag ser vi en række måder at eksponere data fra en applikation over internettet.

Ofte bruger applikationen en SOAP- eller REST-webservice til at udsætte deres API'er. Der er dog streamingprotokoller som RSS og Atom også at overveje.

I denne hurtige vejledning undersøger vi et par praktiske måder at arbejde med webservices i Groovy på hver af disse protokoller.

2. Udfør HTTP-anmodninger

Til at begynde med skal vi udføre en simpel HTTP GET-anmodning ved hjælp af URL klasse. Vi forbruger Postman Echo API'erne under vores udforskning.

Først kalder vi openConnection metode til URL klasse og indstil derefter anmodningMetode at få:

def postmanGet = ny URL ('// postman-echo.com/get') def getConnection = postmanGet.openConnection () getConnection.requestMethod = 'GET' påstå getConnection.responseCode == 200

På samme måde kan vi lave en POST-anmodning ved at indstille anmodningMetode at poste:

def postmanPost = ny URL ('// postman-echo.com/post') def postConnection = postmanPost.openConnection () postConnection.requestMethod = 'POST' hævde postConnection.responseCode == 200

Vi kan også videregive parametrene til POST-anmodningen ved hjælp af outputStream.withWriter:

def form = "param1 = Dette er anmodningsparameter." postConnection.doOutput = ægte def tekst postConnection.with {outputStream.withWriter {outputStreamWriter -> outputStreamWriter << form} text = content.text} hævder postConnection.responseCode == 200

Her, Groovy's med lukning ser ret praktisk ud og gør koden renere.

Lad os bruge JsonSlurper at analysere Snor svar til JSON:

JsonSlurper jsonSlurper = ny JsonSlurper () hævder jsonSlurper.parseText (tekst) ?. json.param1 == "Dette er anmodningsparameter."

3. RSS og Atom-feeds

RSS og Atom-feed er almindelige måder at eksponere indholdet som nyheder, blogs og tekniske fora over internettet.

Begge feeds er også XML-formateret. Derfor kan vi bruge Groovy's XMLParser klasse for at analysere indholdet.

Lad os læse et par tophistorier fra Google Nyheder ved hjælp af deres RSS-feed:

def rssFeed = ny XmlParser () .parse ("// news.google.com/rss?hl=da-US&gl=US&ceid=US:da") def stories = [] (0..4). hver {def vare = rssFeed.channel.item.get (it) historier << item.title.text ()} hævder stories.size () == 5

På samme måde kan vi læse Atom-feeds. På grund af variationen i specifikationerne for begge protokoller får vi dog adgang til indholdet forskelligt i Atom-feeds:

def atomFeed = ny XmlParser () .parse ("// news.google.com/atom?hl=da-US&gl=US&ceid=US:da") def historier = [] (0..4). hver {def-indgang = atomFeed.entry.get (it) historier << entry.title.text ()} hævder stories.size () == 5

Vi forstår også, at Groovy understøtter, at alle Java-biblioteker opmuntres i Groovy. Derfor kan vi helt sikkert bruge Rom API til at læse RSS-feeds.

4. SOAP-anmodning og svar

SOAP er en af ​​de mest populære webserviceprotokoller, der bruges af applikationer til at udsætte deres tjenester over internettet.

Vi bruger groovy-wslite-biblioteket til at forbruge SOAP API'erne. Lad os tilføje sin seneste afhængighed til vores pom.xml:

 com.github.groovy-wslite groovy-wslite 1.1.3 

Alternativt kan vi tilføje den seneste afhængighed ved hjælp af Gradle:

kompilere gruppe: 'com.github.groovy-wslite', navn: 'groovy-wslite', version: '1.1.3'

Eller hvis vi vil skrive et Groovy-script. Vi kan tilføje det direkte ved hjælp af @Tag fat:

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

Groovy-wslite-biblioteket leverer SOAPClient klasse til at kommunikere med SOAP API'er. På samme tid har den SOAPMessageBuilder klasse for at oprette anmodningsmeddelelsen.

Lad os forbruge en nummerkonvertering SOAP-tjeneste ved hjælp af 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 ord = respons.NumberToWordsResponse hævder ord == "hundrede og treogtyve"

5. REST-anmodning og svar

REST er en anden populær arkitektonisk stil, der bruges til at skabe webtjenester. API'erne eksponeres også baseret på HTTP-metoder som GET, POST, PUT og DELETE.

5.1. FÅ

Vi bruger det allerede diskuterede groovy-wslite-bibliotek til at forbruge REST API'erne. Det giver den RESTKlient klasse for problemfri kommunikation.

Lad os lave en GET-anmodning til den allerede diskuterede Postman API:

RESTClient-klient = ny RESTClient ("// postman-echo.com") def sti = "/ get" def-svar, prøv {respons = client.get (sti: sti) hævder respons.statusCode = 200 hævder svar.json? .Headers ? .host == "postman-echo.com"} fangst (RESTClientException e) {påstå e? .respons? .statusCode! = 200}

5.2. STOLPE

Lad os nu sende en POST-anmodning til Postman API. Samtidig videregiver vi formularparametrene som JSON:

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

Her har vi indstillet JSON som standard acceptoverskrift.

6. Godkendelse til webservice

Med den voksende mængde webtjenester og applikationer, der kommunikerer med hinanden, anbefales det at have en sikker webtjeneste.

Som resultat, en kombination af HTTPS og en godkendelsesmekanisme som Basic Auth og OAuth er vigtig.

Derfor skal en applikation godkende sig selv, mens den bruger en webtjeneste-API.

6.1. Grundlæggende godkendelse

Vi kan bruge det allerede diskuterede RESTKlient klasse. Lad os bruge HTTPBasicAuthorization klasse med legitimationsoplysninger til at udføre en grundlæggende godkendelse:

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

Alternativt kan vi direkte videregive legitimationsoplysningerne (Base64-kodet) i overskrifter parameter:

def respons = klient .get (sti: sti, overskrifter: ["Autorisation": "Grundlæggende cG9zdG1hbjpwYXNzd29yZA =="])

6.2. OAuth 1.0

På samme måde kan vi lave en OAuth 1.0-anmodning, der overfører godkendelsesparametrene som forbrugernøgle og forbrugerhemmelighed.

Da vi imidlertid ikke har indbygget support til OAuth 1.0, som vi gør for de andre mekanismer, bliver vi selv nødt til at udføre arbejdet:

def path = "/ oauth1" def params = [oauth_consumer_key: "RKCGzna7bv9YD57c", oauth_signature_method: "HMAC-SHA1", oauth_timestamp: 1567089944, oauth_nonce: "URT7v4", oauth_t = ny RESTClient ("// postman-echo.com") .get (sti: sti, forespørgsel: params) hævder respons.statusCode == 200 hævder respons.statusMessage == "OK" hævder respons.json.status == " passere"

7. Konklusion

I denne vejledning har vi udforsket et par praktiske måder at arbejde med webservices i Groovy.

På samme tid har vi set en nem måde at læse et RSS- eller Atom-feed på.

Som normalt er kodeimplementeringerne tilgængelige på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found