Cliente HTTP em Java: fazendo requisições corretamente
No desenvolvimento web moderno, quase nenhuma aplicação pode funcionar sem interagir com servidores remotos. Seja integração com API REST, carregamento de dados ou envio de formulários — a capacidade de trabalhar corretamente com requisições HTTP em Java é uma habilidade obrigatória para um desenvolvedor. Neste artigo, analisaremos como criar um cliente HTTP confiável em Java, consideraremos abordagens modernas e melhores práticas.
Por que é importante usar o cliente HTTP correto?
Muitos desenvolvedores iniciantes usam a classe obsoleta HttpURLConnection, que surgiu no Java 1.1. Embora funcione, sua API é pesada, inconveniente e requer muito código repetitivo. A partir do Java 11, a biblioteca padrão introduziu o moderno java.net.http.HttpClient, que oferece:
- Suporte a HTTP/2 e WebSocket
- Requisições assíncronas via CompletableFuture
- Padrão Builder simples e claro
- Tratamento automático de cookies e redirecionamentos
Fundamentos do trabalho com HttpClient no Java 11+
Vamos considerar um exemplo básico de envio de uma requisição GET. Primeiro, criamos uma instância do cliente, depois formamos a requisição e a enviamos.
import java.net.URI;import java.net.http.HttpClient;import java.net.http.HttpRequest;import java.net.http.HttpResponse;import java.time.Duration;
public class SimpleHttpClient { public static void main(String[] args) throws Exception { // Cria um cliente com timeout de conexão HttpClient client = HttpClient.newBuilder() .connectTimeout(Duration.ofSeconds(10)) .build();
// Forma uma requisição GET HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://api.example.com/data")) .timeout(Duration.ofSeconds(30)) .header("Accept", "application/json") .GET() .build();
// Envia a requisição e recebe a resposta HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println("Status: " + response.statusCode()); System.out.println("Corpo da resposta: " + response.body()); }}Observe o uso de BodyHandlers.ofString() — esta é uma maneira conveniente de obter o corpo da resposta como uma string. Se precisar processar JSON, é melhor usar BodyHandlers.ofInputStream() e passá-lo para o parser.
Enviando uma requisição POST com corpo
Para enviar dados ao servidor (por exemplo, ao registrar um usuário), usa-se uma requisição POST. Vamos considerar um exemplo com envio de JSON:
import java.net.URI;import java.net.http.HttpClient;import java.net.http.HttpRequest;import java.net.http.HttpResponse;import java.time.Duration;
public class PostRequestExample { public static void main(String[] args) throws Exception { HttpClient client = HttpClient.newHttpClient();
String json = """ { "name": "Ivan Ivanov", "email": "ivan@example.com", "age": 30 } """;
HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://api.example.com/users")) .header("Content-Type", "application/json") .POST(HttpRequest.BodyPublishers.ofString(json)) .timeout(Duration.ofSeconds(15)) .build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
if (response.statusCode() == 201) { System.out.println("Usuário criado com sucesso!"); System.out.println("ID: " + response.body()); } else { System