Перейти к основному содержимому

Краткое руководство по работе с веб-службами в Groovy

· 5 мин. чтения

1. Обзор

В настоящее время мы видим ряд способов предоставления данных приложением через Интернет.

Часто приложение использует веб-службу SOAP или REST для предоставления своих API. Тем не менее, есть потоковые протоколы, такие как RSS и Atom, которые также следует учитывать.

В этом кратком руководстве мы рассмотрим несколько удобных способов работы с веб-службами в Groovy для каждого из этих протоколов.

2. Выполнение HTTP-запросов

Для начала давайте выполним простой запрос HTTP GET, используя класс URL . Мы будем использовать API-интерфейсы Postman Echo во время нашего исследования.

Сначала мы вызовем метод openConnection класса URL , а затем установим для requestMethod значение GET:

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

Точно так же мы можем сделать запрос POST, установив для метода requestMethod значение POST:

def postmanPost = new URL('https://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 с замыканием выглядит очень удобно и делает код чище.

Давайте используем JsonSlurper для анализа ответа String в JSON:

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

3. RSS и Atom-каналы

Канал RSS и Atom — это распространенные способы предоставления контента, такого как новости, блоги и технические форумы, через Интернет.

Кроме того, оба канала имеют формат XML. Поэтому мы можем использовать класс Groovy XMLParser для разбора содержимого.

Давайте прочитаем несколько главных новостей из Новостей Google , используя их RSS-канал:

def rssFeed = new XmlParser()
.parse("https://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("https://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. Поэтому мы, безусловно, можем использовать Rome API для чтения RSS-каналов.

4. SOAP-запрос и ответ

SOAP — один из самых популярных протоколов веб-служб, используемых приложениями для предоставления своих служб через Интернет.

Мы будем использовать библиотеку groovy-wslite для использования API-интерфейсов SOAP. Давайте добавим его последнюю зависимость в наш pom.xml :

<dependency>
<groupId>com.github.groovy-wslite</groupId>
<artifactId>groovy-wslite</artifactId>
<version>1.1.3</version>
</dependency>

Кроме того, мы можем добавить последнюю зависимость с помощью 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 для взаимодействия с API-интерфейсами SOAP . В то же время у него есть класс SOAPMessageBuilder для создания сообщения запроса.

Давайте воспользуемся сервисом SOAP преобразования чисел с помощью SOAPClient :

def url = "http://www.dataaccess.com/webservicesserver/numberconversion.wso"
def soapClient = new SOAPClient(url)
def message = new SOAPMessageBuilder().build({
body {
NumberToWords(xmlns: "http://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-запрос к уже рассмотренному Postman API:

RESTClient client = new RESTClient("https://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. ОАут 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("https://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 .