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.