Cliente HTTP para Java: visão geral das principais bibliotecas
No desenvolvimento Java moderno, praticamente nenhuma aplicação funciona sem interação via protocolo HTTP. Envio de requisições para APIs REST, upload de arquivos, trabalho com microsserviços — tudo isso exige um cliente HTTP confiável e prático. Neste artigo, veremos as quatro bibliotecas mais populares para trabalhar com HTTP em Java: o HttpClient padrão (Java 11+), Apache HttpClient, OkHttp e Retrofit. Você conhecerá suas características, pontos fortes e terá exemplos práticos de código.
1. Java 11 HttpClient (java.net.http)
A partir do Java 11, um cliente HTTP moderno foi adicionado à biblioteca padrão, com o objetivo de substituir o obsoleto HttpURLConnection. Ele suporta HTTP/2, WebSocket, requisições assíncronas e fluxos reativos.
Vantagens:
- Não requer dependências adicionais — já está incluído no JDK.
- Suporte a HTTP/2 e atualização automática de protocolo.
- API conveniente com chamadas síncronas e assíncronas.
- Suporte nativo para gerenciamento de cookies, redirecionamentos e autenticação.
Exemplo de requisição GET síncrona:
import java.net.URI;import java.net.http.HttpClient;import java.net.http.HttpRequest;import java.net.http.HttpResponse;
public class Java11HttpClientExample { public static void main(String[] args) throws Exception { HttpClient client = HttpClient.newHttpClient(); HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://jsonplaceholder.typicode.com/posts/1")) .GET() .build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString()); System.out.println("Status code: " + response.statusCode()); System.out.println("Body: " + response.body()); }}Exemplo de requisição POST assíncrona:
import java.net.URI;import java.net.http.HttpClient;import java.net.http.HttpRequest;import java.net.http.HttpResponse;import java.net.http.HttpRequest.BodyPublishers;import java.util.concurrent.CompletableFuture;
public class AsyncPostExample { public static void main(String[] args) { HttpClient client = HttpClient.newHttpClient(); HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://jsonplaceholder.typicode.com/posts")) .header("Content-Type", "application/json") .POST(BodyPublishers.ofString("{\\"title\\":\\"foo\\",\\"body\\":\\"bar\\",\\"userId\\":1}")) .build();
CompletableFuture<HttpResponse<String>> future = client.sendAsync(request, HttpResponse.BodyHandlers.ofString()); future.thenAccept(response -> { System.out.println("Status: " + response.statusCode()); System.out.println("Body: " + response.body()); }).join(); }}2. Apache HttpClient
Uma biblioteca clássica da Apache, que por muito tempo foi o padrão de facto. A versão mais recente (5.x) recebeu melhorias significativas: suporte a HTTP/2, melhor gerenciamento de pool de conexões e configuração mais flexível.
Vantagens:
- Máxima flexibilidade e ajuste fino (timeouts, interceptadores, cache).
- Estabilidade comprovada ao longo do tempo.
- Suporte a vários esquemas de autenticação (Basic, Digest, NTLM).
- Boa integração com proxy e SSL.
Exemplo de requisição GET com Apache HttpClient 5:
import org.apache.hc.client5.http.classic.methods.HttpGet;import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;import org.apache.hc.client5.http.impl.classic.Clos