Kratki vodič za rad s web uslugama u Groovyju

1. Pregled

Danas vidimo niz načina za izlaganje podataka pomoću aplikacije putem weba.

Aplikacija često koristi web-uslugu SOAP ili REST za izlaganje svojih API-ja. Međutim, postoje i protokoli za streaming poput RSS-a i Atoma koje treba uzeti u obzir.

U ovom brzom vodiču istražit ćemo nekoliko praktičnih načina rada s web uslugama u Groovyju za svaki od ovih protokola.

2. Izvršite HTTP zahtjeve

Za početak izvršimo jednostavan HTTP GET zahtjev pomoću URL razred. Tijekom našeg istraživanja trošit ćemo API-je poštara za poštare.

Prvo ćemo nazvati openConnection metoda URL razred, a zatim postavite requestMethod dobiti:

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

Slično tome, možemo poslati POST zahtjev postavljanjem requestMethod objaviti:

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

Također, parametre možemo proslijediti POST zahtjevu pomoću outputStream.withWriter:

def form = "param1 = Ovo je parametar zahtjeva." postConnection.doOutput = true def text postConnection.with {outputStream.withWriter {outputStreamWriter -> outputStreamWriter << form} text = content.text} potvrditi postConnection.responseCode == 200

Evo, Groovyjeva s zatvaranje izgleda prilično zgodno i čini kod čistijim.

Iskoristimo JsonSlurper raščlaniti Niz odgovor u JSON:

JsonSlurper jsonSlurper = novi JsonSlurper () potvrdi jsonSlurper.parseText (tekst) ?. json.param1 == "Ovo je parametar zahtjeva."

3. RSS i Atom feedovi

RSS i Atom feed uobičajeni su načini izlaganja sadržaja poput vijesti, blogova i tehnoloških foruma putem weba.

Također, oba feeda su u XML formatu. Stoga možemo koristiti Groovyev XMLParser razreda za raščlanjivanje sadržaja.

Pročitajmo nekoliko najvažnijih vijesti s Google vijesti koristeći njihov RSS feed:

def rssFeed = novi 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) priče << item.title.text ()} potvrditi stories.size () == 5

Slično tome, možemo čitati Atom feedove. Međutim, zbog varijacija u specifikacijama oba protokola, sadržaju ćemo pristupiti različito u Atom feedovima:

def atomFeed = novi 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) priče << entry.title.text ()} potvrditi stories.size () == 5

Također, razumijemo da Groovy podržava sve Java knjižnice koje se potiču u Groovyu. Stoga sigurno možemo koristiti Rome API za čitanje RSS feedova.

4. SOAP zahtjev i odgovor

SOAP je jedan od najpopularnijih protokola web usluga koji aplikacije koriste za izlaganje svojih usluga putem weba.

Upotrijebit ćemo groovy-wslite knjižnicu za konzumiranje SOAP API-ja. Dodajmo njegovu najnoviju ovisnost o našoj pom.xml:

 com.github.groovy-wslite groovy-wslite 1.1.3 

Alternativno, možemo dodati najnoviju ovisnost koristeći Gradle:

sastaviti grupu: 'com.github.groovy-wslite', naziv: 'groovy-wslite', verzija: '1.1.3'

Ili ako želimo napisati Groovyev scenarij. Možemo ga dodati izravno pomoću @ Grab:

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

Knjižnica groovy-wslite pruža SOAPClient klase za komunikaciju sa SOAP API-ima. Istodobno, ima i SOAPMessageBuilder klase za stvaranje poruke zahtjeva.

Upotrijebimo SOAP uslugu za pretvorbu brojeva pomoću 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 potvrditi riječi == "sto dvadeset i tri"

5. ODMORNI zahtjev i odgovor

REST je još jedan popularan arhitektonski stil koji se koristi za stvaranje web usluga. Također, API-ji su izloženi na temelju HTTP metoda poput GET, POST, PUT i DELETE.

5.1. DOBITI

Upotrijebit ćemo već raspravljenu knjižnicu groovy-wslite za konzumiranje REST API-ja. Pruža RESTClient razred za nesmetanu komunikaciju.

Izvršimo GET zahtjev za već raspravljeni API poštara:

RESTClient klijent = novi RESTClient ("// postman-echo.com") def path = "/ get" def response probati {response = client.get (path: path) potvrditi response.statusCode = 200 assert response.json? .Headers ? .host == "postman-echo.com"} ulov (RESTClientException e) {potvrditi e? .odgovor? .statusCode! = 200}

5.2. OBJAVI

Ajmo sada podnijeti POST zahtjev za Postman API. Istodobno ćemo parametre obrasca proslijediti kao 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} potvrditi response.json? .data == params 

Ovdje smo postavili JSON kao zadano zaglavlje za prihvaćanje.

6. Autentifikacija za web uslugu

S rastućom količinom web usluga i aplikacija koje međusobno komuniciraju, preporuča se imati sigurnu web uslugu.

Kao rezultat, važna je kombinacija HTTPS-a i mehanizma provjere autentičnosti poput Basic Auth i OAuth.

Stoga se aplikacija mora provjeriti autentičnost dok troši API web usluge.

6.1. Osnovna aut

Možemo se poslužiti već raspravljenim RESTClient razred. Iskoristimo HTTPBasicAuthorization razred s vjerodajnicama za izvođenje osnovne provjere autentičnosti:

def path = "/ basic-auth" client.authorization = novi HTTPBasicAuthorization ("poštar", "lozinka") response = client.get (path: path) potvrditi response.statusCode == 200 potvrditi response.json? .authenticated == pravi

Vjerodajnice (kodirane u Base64) možemo izravno proslijediti u zaglavlja parametar:

def response = client .get (put: put, zaglavlja: ["Autorizacija": "Osnovni cG9zdG1hbjpwYXNzd29yZA =="])

6.2. OAuth 1.0

Slično tome, možemo podnijeti zahtjev OAuth 1.0 koji prosljeđuje autorizacijske parametre poput potrošačkog ključa i potrošačke tajne.

Međutim, budući da nemamo ugrađenu podršku za OAuth 1.0 kao za ostale mehanizme, posao ćemo morati obaviti sami:

def path = "/ oauth1" def params = [oauth_consumer_key: "RKCGzna7bv9YD57c", oauth_signature_method: "HMAC-SHA1", oauth_timestamp: 1567089944, oauth_nonce: "URT7v4OffGt 'OWGtAvOgAtArOgAtOrgAtOrgAtOrgOrgOrgOrgOrgOrgOrgOrgOrgArr = new RESTClient ("// postman-echo.com") .get (path: path, query: params) assert response.statusCode == 200 assert response.statusMessage == "OK" assert response.json.status == " proći"

7. Zaključak

U ovom uputstvu istražili smo nekoliko praktičnih načina rad s web uslugama u Groovyu.

Istodobno, vidjeli smo jednostavan način čitanja RSS ili Atom feeda.

Kao i obično, implementacije koda dostupne su na GitHubu.