Cliente HTTP em Java: fazendo requisições corretamente
No desenvolvimento moderno, praticamente qualquer aplicação interage com serviços externos via HTTP. Seja uma REST API, carregamento de dados do servidor ou envio de formulários — saber trabalhar com requisições HTTP é uma habilidade obrigatória para o desenvolvedor Java. Neste artigo, vamos analisar como criar um cliente HTTP em Java, usando tanto ferramentas padrão quanto bibliotecas de terceiros populares. Você aprenderá como executar corretamente requisições GET e POST, tratar erros e fazer parsing de respostas.
1. Abordagem clássica: HttpURLConnection
Por muito tempo, a forma padrão de trabalhar com HTTP em Java foi a classe HttpURLConnection. Ela faz parte do pacote java.net e não requer instalação de dependências adicionais. Vejamos um exemplo de execução de uma requisição GET:
import java.io.BufferedReader;import java.io.InputStreamReader;import java.net.HttpURLConnection;import java.net.URL;
public class SimpleHttpClient { public static void main(String[] args) throws Exception { URL url = new URL("https://api.example.com/data"); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); connection.setRequestProperty("Accept", "application/json");
int responseCode = connection.getResponseCode(); System.out.println("Response Code: " + responseCode);
if (responseCode == HttpURLConnection.HTTP_OK) { 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()); } else { System.out.println("GET request failed"); } connection.disconnect(); }}Para uma requisição POST com envio de dados JSON, o código será um pouco mais complexo:
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 jsonInput = "{\\"name\\":\\"John\\",\\"email\\":\\"john@example.com\\"}";
try (OutputStream os = connection.getOutputStream()) { byte[] input = jsonInput.getBytes("utf-8"); os.write(input, 0, input.length); }
int responseCode = connection.getResponseCode(); System.out.println("POST Response Code: " + responseCode);
if (responseCode == HttpURLConnection.HTTP_CREATED) { // Leitura da resposta análoga ao GET } connection.disconnect(); }}Vantagens do HttpURLConnection:
- Não requer bibliotecas adicionais
- Controle total sobre a requisição
- Suporte a todos os métodos HTTP
Desvantagens:
- API verbosa e inconveniente
- Difícil tratamento de erros
- Sem suporte nativo a protocolos modernos (HTTP/2)
2. Padrão moderno: HttpClient (Java 11+)
A partir do Java 11, um novo java.net.http.HttpClient foi adicionado à biblioteca padrão. Ele fornece uma API moderna, assíncrona e muito mais conveniente. Veja como fica uma requisição GET com ele:
import java.net.URI;import java.net.http.HttpClient;import java.net.ht