Кратко ръководство за работа с уеб услуги в Groovy

1. Общ преглед

В днешно време виждаме редица начини за излагане на данни от приложение в мрежата.

Често приложението използва SOAP или REST уеб услуга, за да изложи своите API. Съществуват обаче протоколи за стрийминг като RSS и Atom, които също трябва да се разгледат.

В този бърз урок ще разгледаме няколко удобни начина за работа с уеб услуги в Groovy за всеки от тези протоколи.

2. Изпълнете HTTP заявки

Като начало, нека изпълним проста HTTP GET заявка, използвайки класа на URL . Ще консумираме API на Postman Echo по време на нашето проучване.

Първо ще извикаме метода openConnection на класа URL и след това ще зададем requestMethod на GET:

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

По същия начин можем да направим POST заявка, като зададем requestMethod на POST:

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

Също така можем да предадем параметрите на заявката POST, използвайки 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

Тук Groovy's със затваряне изглежда доста удобен и прави кода по-чист.

Нека използваме JsonSlurper, за да анализираме отговора String в JSON:

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

3. RSS и Atom емисии

RSS и Atom емисията са често срещани начини за излагане на съдържанието като новини, блогове и технически форуми в мрежата.

Също така и двете емисии са форматирани в XML. Следователно можем да използваме класа XMLParser на Groovy, за да анализираме съдържанието.

Нека прочетем няколко най-важни истории от Google News, използвайки техния 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

По същия начин можем да четем емисиите на Atom. Въпреки това, поради промяната в спецификациите на двата протокола, ще имаме достъп до съдържанието по различен начин в 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

Също така разбираме, че Groovy поддържа всички Java библиотеки се насърчават в Groovy. Следователно със сигурност можем да използваме API на Рим, за да четем RSS емисиите.

4. Искане и отговор на SOAP

SOAP е един от най-популярните протоколи за уеб услуги, използвани от приложенията за излагане на техните услуги в мрежата.

Ще използваме библиотеката groovy-wslite, за да консумираме SOAP API. Нека добавим последната му зависимост към нашия pom.xml :

 com.github.groovy-wslite groovy-wslite 1.1.3 

Като алтернатива можем да добавим най-новата зависимост, използвайки Gradle:

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

Или ако искаме да напишем скрипт Groovy. Можем да го добавим директно с @Grab :

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

Библиотеката groovy-wslite осигурява клас SOAPClient за комуникация със SOAP API . В същото време той има клас SOAPMessageBuilder, за да създаде съобщението за заявка.

Нека консумираме SOAP услуга за преобразуване на числа, използвайки 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. Искане и отговор на REST

REST е друг популярен архитектурен стил, използван за създаване на уеб услуги. Също така API са изложени въз основа на HTTP методи като GET, POST, PUT и DELETE.

5.1. ВЗЕМЕТЕ

Ще използваме вече обсъжданата библиотека groovy-wslite, за да консумираме REST API. Той осигурява клас RESTClient за безпроблемна комуникация .

Нека направим GET заявка към вече обсъждания 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. ПОСТ

Сега, нека направим POST заявка към Postman API. В същото време ще предадем параметрите на формата като 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 

Тук сме задали JSON като заглавие за приемане по подразбиране.

6. Удостоверяване за уеб услуга

С нарастващото количество уеб услуги и приложения, комуникиращи една с друга, се препоръчва да имате защитена уеб услуга.

В резултат на това е важна комбинация от HTTPS и механизъм за удостоверяване като Basic Auth и OAuth .

Следователно приложението трябва да се удостоверява, докато консумира API на уеб услуга.

6.1. Основна авт

Можем да използваме вече обсъждания клас RESTClient . Нека използваме класа HTTPBasicAuthorization с идентификационни данни, за да извършим основно удостоверяване:

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

Като алтернатива можем директно да предадем идентификационните данни (кодирани в Base64) в параметъра на заглавките :

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

6.2. OAuth 1.0

По същия начин можем да направим заявка за OAuth 1.0, предавайки параметрите за автентичност като потребителски ключ и потребителска тайна.

Тъй като обаче нямаме вградена поддръжка за OAuth 1.0, както за другите механизми, ще трябва да свършим работата сами:

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. Заключение

В този урок разгледахме няколко полезни начина за работа с уеб услуги в Groovy .

В същото време видяхме лесен начин за четене на RSS или Atom емисия.

Както обикновено, реализациите на кода са достъпни в GitHub.