Um guia rápido para trabalhar com serviços da Web no Groovy
1. Visão geral
Atualmente, vemos várias maneiras de expor dados por um aplicativo na Web.
Freqüentemente, o aplicativo usa um serviço da WebSOAP ouREST para expor suas APIs. No entanto, também existem protocolos de streaming como RSS e Atom.
Neste tutorial rápido, vamos explorar algumas maneiras úteis de trabalhar com serviços da web emGroovy para cada um desses protocolos.
2. Executar solicitações HTTP
Para começar, vamos executar uma solicitação HTTP GET simples usando a classeURL. Consumiremos as APIsPostman Echo durante nossa exploração.
Primeiro, chamaremos o métodoopenConnection da classeURLe definiremosrequestMethod para GET:
def postmanGet = new URL('https://postman-echo.com/get')
def getConnection = postmanGet.openConnection()
getConnection.requestMethod = 'GET'
assert getConnection.responseCode == 200
Da mesma forma, podemos fazer uma solicitação POST definindorequestMethod como POST:
def postmanPost = new URL('https://postman-echo.com/post')
def postConnection = postmanPost.openConnection()
postConnection.requestMethod = 'POST'
assert postConnection.responseCode == 200
Além disso, podemos passar os parâmetros para a solicitação POST usandooutputStream.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
Aqui, o fechamentowith do Groovy parece bastante útil e torna o código mais limpo.
Vamos usarJsonSlurper para analisar a respostaString em JSON:
JsonSlurper jsonSlurper = new JsonSlurper()
assert jsonSlurper.parseText(text)?.json.param1 == "This is request parameter."
3. RSS e Atom Feeds
RSSeAtom feeds são formas comuns de expor o conteúdo, como notícias, blogs e fóruns de tecnologia na web.
Além disso, os dois feeds são formatados em XML. Portanto, podemos usar a classeXMLParser do Groovy para analisar o conteúdo.
Vamos ler algumas das principais histórias deGoogle News utilizando seu feed 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
Da mesma forma, podemos ler os feeds Atom. No entanto, devido à variação nas especificações de ambos os protocolos, acessaremos o conteúdo de maneira diferente nos feeds 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
Além disso, entendemos que o Groovy suporta todas as bibliotecas Java são incentivadas no Groovy. Portanto, podemos certamente usarRome API para ler os feeds RSS.
4. Solicitação e resposta SOAP
O SOAP é um dos protocolos de serviço da web mais populares usados pelos aplicativos para expor seus serviços pela web.
Usaremos a bibliotecagroovy-wslite para consumir as APIs SOAP. Vamos adicionar seu últimodependency ao nossopom.xml:
com.github.groovy-wslite
groovy-wslite
1.1.3
Como alternativa, podemos adicionar a dependência mais recente usando Gradle:
compile group: 'com.github.groovy-wslite', name: 'groovy-wslite', version: '1.1.3'
Ou se quisermos escrever um script Groovy. Podemos adicioná-lo diretamente usando@Grab:
@Grab(group='com.github.groovy-wslite', module='groovy-wslite', version='1.1.3')
The groovy-wslite library provides the SOAPClient class to communicate with SOAP APIs. Ao mesmo tempo, possui a classeSOAPMessageBuilder para criar a mensagem de solicitação.
Vamos consumir umNumber conversion SOAP Service usando oSOAPClient:
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. Solicitação e resposta REST
REST é outro estilo arquitetônico popular usado para criar serviços da web. Além disso, as APIs são expostas com base em métodos HTTP como GET, POST, PUT e DELETE.
5.1. GET
Usaremos a biblioteca groovy-wslite já discutida para consumir as APIs REST. It provides the RESTClient class for hassle-free communication.
Vamos fazer uma solicitação GET para a API Postman já discutida:
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
Agora, vamos fazer uma solicitação POST para a API Postman. Ao mesmo tempo, passaremos os parâmetros do formulário como 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
Aqui, definimos o JSON como o cabeçalho de aceitação padrão.
6. Autenticação para serviço Web
Com a crescente quantidade de serviços e aplicativos da web que se comunicam uns com os outros, é recomendável ter um serviço da web seguro.
Como resultado,a combination of HTTPS and an authentication mechanism like Basic Auth and OAuth is important.
Portanto, um aplicativo deve se autenticar enquanto consome uma API de serviço da web.
6.1. Autenticação básica
Podemos usar o já discutidoRESTClient class. Vamos usar a classeHTTPBasicAuthorization com credenciais para realizar uma autenticação básica:
def path = "/basic-auth"
client.authorization = new HTTPBasicAuthorization("postman", "password")
response = client.get(path: path)
assert response.statusCode == 200
assert response.json?.authenticated == true
Como alternativa, podemos passar diretamente as credenciais (codificado em Base64) no parâmetroheaders:
def response = client
.get(path: path, headers: ["Authorization": "Basic cG9zdG1hbjpwYXNzd29yZA=="])
6.2. OAuth 1.0
Da mesma forma, podemos fazer uma solicitação do OAuth 1.0 passando os parâmetros de autenticação, como chave do consumidor e segredo do consumidor.
No entanto, como não temos suporte embutido para OAuth 1.0 como temos para os outros mecanismos, teremos que fazer o trabalho nós mesmos:
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. Conclusão
Neste tutorial, exploramos algumas maneiras úteis parawork with web services in Groovy.
Ao mesmo tempo, vimos uma maneira fácil de ler um feed RSS ou Atom.
Como de costume, as implementações de código estão disponíveisover on GitHub.