Cliente HTTP em Java: fazendo requisições corretamente de A a Z
No desenvolvimento moderno em Java, a interação com serviços web externos e REST API tornou-se parte integrante de praticamente qualquer aplicação. Independentemente de você estar escrevendo um microsserviço, um aplicativo móvel ou um sistema corporativo, saber enviar requisições HTTP corretamente é uma habilidade criticamente importante. Neste artigo, abordaremos todas as formas de criar um cliente HTTP em Java: desde o clássico HttpURLConnection até bibliotecas modernas, como java.net.http.HttpClient, OkHttp e RestTemplate. Você aprenderá como fazer requisições GET, POST, PUT e DELETE, processar respostas e escolher a ferramenta certa para sua tarefa.
1. Abordagem clássica: HttpURLConnection
Por muitos anos, a forma padrão de trabalhar com HTTP em Java foi a classe HttpURLConnection. Ela faz parte do JDK e não requer dependências adicionais. No entanto, sua API é considerada de baixo nível e verbosa, especialmente para requisições complexas.
Exemplo de requisição GET:
import java.io.BufferedReader;import java.io.InputStreamReader;import java.net.HttpURLConnection;import java.net.URL;
public class HttpURLConnectionExample { public static void main(String[] args) throws Exception { URL url = new URL("https://api.example.com/users"); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); connection.setRequestProperty("Accept", "application/json");
int responseCode = connection.getResponseCode(); System.out.println("Response Code: " + responseCode);
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream())); String inputLine; StringBuilder response = new StringBuilder(); while ((inputLine = in.readLine()) != null) { response.append(inputLine); } in.close(); System.out.println("Response: " + response.toString()); }}Exemplo de requisição POST com JSON:
import java.io.OutputStream;import java.net.HttpURLConnection;import java.net.URL;
public class PostExample { public static void main(String[] args) throws Exception { URL url = new URL("https://api.example.com/users"); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("POST"); connection.setRequestProperty("Content-Type", "application/json"); connection.setDoOutput(true);
String jsonInputString = "{\\"name\\": \\"John\\", \\"age\\": 30}"; try (OutputStream os = connection.getOutputStream()) { byte[] input = jsonInputString.getBytes("utf-8"); os.write(input, 0, input.length); }
int responseCode = connection.getResponseCode(); System.out.println("Response Code: " + responseCode); }}Vantagens: embutido no JDK, não requer bibliotecas.
Desvantagens: código complexo, sem suporte a HTTP/2, trabalho inconveniente com timeouts e erros.
2. HttpClient moderno (Java 11+)
A partir do Java 11, um novo java.net.http.HttpClient foi adicionado à biblioteca padrão. Ele suporta HTTP/2, WebSocket, requisições assíncronas e oferece uma API muito mais limpa e moderna.
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 ModernHttpClientExample { public static void main(String[] args) throws Exception { HttpClient client = HttpClient.newHttpClient(); HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://a