Recentemente, me deparei com a necessidade de consumir um serviço REST que requeria o uso do verbo GET com um corpo na mensagem, indo totalmente contra o padrão. É amplamente reconhecido entre os desenvolvedores de aplicativos para a web que, para tais situações, o verbo mais apropriado seria o POST!
Eu estava utilizando a biblioteca okhttp no projeto, que é bastante conhecida. Contudo, para cenários que demandavam o uso de GET com corpo, a biblioteca não permitia essa funcionalidade. Após alguma pesquisa, descobri a nova API de Cliente HTTP, introduzida a partir da versão 9 do Java.
Dado que essa situação foi bastante incomum, decidi criar este artigo para compartilhar a solução encontrada.
Aqui está o código fonte da classe que desenvolvi para atender a essa necessidade específica:
package com.github.romarioteles.clientehttp;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.util.Base64;
import com.github.romarioteles.exception.ClienteHttpException;
public class GetWithBody {
public String execute(String url, String usuario, String senha, String requestBody) throws ClienteHttpException {
try{
HttpClient httpClient = HttpClient.newHttpClient();
URI uri = URI.create(url);
HttpRequest request = HttpRequest.newBuilder()
.uri(uri)
.header("Content-Type", "application/json")
.header("Authorization", getBasicAuthotizationBase64(usuario, senha))
.method("GET", HttpRequest.BodyPublishers.ofString(requestBody))
.build();
HttpResponse response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());
if(response.statusCode() >=200 && response.statusCode() <= 299){
return response.body();
}
throw new ClienteHttpException("Requisição retornou status: "+response.statusCode(), response.body(), null);
}catch(Exception e){
throw new ClienteHttpException(e.getMessage(), null, e);
}
}
private String getBasicAuthotizationBase64(String usuario, String senha) {
String userCredentials = usuario + ":" + senha;
return "Basic " + Base64.getEncoder().encodeToString((userCredentials.getBytes()));
}
}
Fiquei surpreso com a facilidade de uso desta nova API em comparação com sua antecessora HttpUrlConnection. Especialmente pela capacidade de ler o corpo da resposta usando os BodyHandlers.Na seção de referências, incluí um link bastante útil para você se aprofundar no assunto.
OpenJDK: https://openjdk.org/groups/net/httpclient/intro.html
Comentários
Postar um comentário