Pular para o conteúdo principal

Cliente HTTP nativo do Java, uma alternativa às libs de terceiros

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