Cliente HTTP en Java: haciendo solicitudes correctamente de la A a la Z
En el desarrollo moderno en Java, la interacción con servicios web externos y API REST se ha convertido en una parte esencial de prácticamente cualquier aplicación. Independientemente de si estás escribiendo un microservicio, una aplicación móvil o un sistema corporativo, saber cómo enviar solicitudes HTTP correctamente es una habilidad críticamente importante. En este artículo, analizaremos todas las formas de crear un cliente HTTP en Java: desde el clásico HttpURLConnection hasta bibliotecas modernas como java.net.http.HttpClient, OkHttp y RestTemplate. Aprenderás cómo hacer solicitudes GET, POST, PUT y DELETE, procesar respuestas y elegir la herramienta adecuada para tu tarea.
1. Enfoque clásico: HttpURLConnection
Durante muchos años, la forma estándar de trabajar con HTTP en Java fue la clase HttpURLConnection. Forma parte del JDK y no requiere dependencias adicionales. Sin embargo, su API se considera de bajo nivel y engorrosa, especialmente para solicitudes complejas.
Ejemplo de solicitud 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()); }}Ejemplo de solicitud POST con 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); }}Ventajas: integrado en el JDK, no requiere bibliotecas.
Desventajas: código complejo, sin soporte para HTTP/2, manejo incómodo de tiempos de espera y errores.
2. HttpClient moderno (Java 11+)
A partir de Java 11, se agregó a la biblioteca estándar un nuevo java.net.http.HttpClient. Soporta HTTP/2, WebSocket, solicitudes asíncronas y proporciona una API mucho más limpia y moderna.
Solicitud 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