En este tema, aprenderemos sobre cómo trabajar con URLs y la clase HttpURLConnection en Java para realizar solicitudes HTTP. Este conocimiento es fundamental para desarrollar aplicaciones que interactúan con servicios web y APIs.

Conceptos Clave

  1. URL (Uniform Resource Locator): Es una referencia a un recurso en la web. Una URL tiene la siguiente estructura:

    protocolo://host:puerto/ruta?parametros
    
    • Protocolo: El esquema de la URL, como http, https, ftp, etc.
    • Host: El nombre del dominio o la dirección IP del servidor.
    • Puerto: El puerto en el servidor al que se accede (opcional, por defecto es 80 para HTTP y 443 para HTTPS).
    • Ruta: La ruta al recurso en el servidor.
    • Parámetros: Los parámetros de consulta (opcional).
  2. HttpURLConnection: Es una clase en Java que permite realizar solicitudes HTTP y manejar las respuestas. Es parte del paquete java.net.

Ejemplo Práctico

Paso 1: Crear una URL

Primero, creamos una instancia de la clase URL con la URL del recurso al que queremos acceder.

import java.net.URL;

public class URLExample {
    public static void main(String[] args) {
        try {
            URL url = new URL("https://jsonplaceholder.typicode.com/posts/1");
            System.out.println("Protocolo: " + url.getProtocol());
            System.out.println("Host: " + url.getHost());
            System.out.println("Ruta: " + url.getPath());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Paso 2: Establecer una Conexión HTTP

Usamos la clase HttpURLConnection para abrir una conexión a la URL y realizar una solicitud HTTP.

import java.net.HttpURLConnection;
import java.net.URL;

public class HttpURLConnectionExample {
    public static void main(String[] args) {
        try {
            URL url = new URL("https://jsonplaceholder.typicode.com/posts/1");
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("GET");
            
            int responseCode = connection.getResponseCode();
            System.out.println("Código de respuesta: " + responseCode);
            
            if (responseCode == HttpURLConnection.HTTP_OK) {
                // Leer la respuesta
                BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
                String inputLine;
                StringBuffer response = new StringBuffer();
                
                while ((inputLine = in.readLine()) != null) {
                    response.append(inputLine);
                }
                in.close();
                
                // Imprimir la respuesta
                System.out.println("Respuesta: " + response.toString());
            } else {
                System.out.println("Solicitud fallida");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Explicación del Código

  1. Crear la URL:

    URL url = new URL("https://jsonplaceholder.typicode.com/posts/1");
    
  2. Abrir la conexión:

    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
    
  3. Configurar la solicitud:

    connection.setRequestMethod("GET");
    
  4. Obtener el código de respuesta:

    int responseCode = connection.getResponseCode();
    
  5. Leer la respuesta:

    BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
    String inputLine;
    StringBuffer response = new StringBuffer();
    
    while ((inputLine = in.readLine()) != null) {
        response.append(inputLine);
    }
    in.close();
    
  6. Imprimir la respuesta:

    System.out.println("Respuesta: " + response.toString());
    

Ejercicio Práctico

Ejercicio 1: Realizar una Solicitud POST

Modifica el ejemplo anterior para realizar una solicitud POST a la URL https://jsonplaceholder.typicode.com/posts con el siguiente cuerpo JSON:

{
  "title": "foo",
  "body": "bar",
  "userId": 1
}

Solución

import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;

public class HttpPostExample {
    public static void main(String[] args) {
        try {
            URL url = new URL("https://jsonplaceholder.typicode.com/posts");
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("POST");
            connection.setRequestProperty("Content-Type", "application/json; utf-8");
            connection.setRequestProperty("Accept", "application/json");
            connection.setDoOutput(true);
            
            String jsonInputString = "{\"title\": \"foo\", \"body\": \"bar\", \"userId\": 1}";
            
            try(OutputStream os = connection.getOutputStream()) {
                byte[] input = jsonInputString.getBytes("utf-8");
                os.write(input, 0, input.length);           
            }
            
            int responseCode = connection.getResponseCode();
            System.out.println("Código de respuesta: " + responseCode);
            
            if (responseCode == HttpURLConnection.HTTP_CREATED) {
                BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
                String inputLine;
                StringBuffer response = new StringBuffer();
                
                while ((inputLine = in.readLine()) != null) {
                    response.append(inputLine);
                }
                in.close();
                
                System.out.println("Respuesta: " + response.toString());
            } else {
                System.out.println("Solicitud fallida");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Explicación del Código

  1. Configurar la solicitud POST:

    connection.setRequestMethod("POST");
    connection.setRequestProperty("Content-Type", "application/json; utf-8");
    connection.setRequestProperty("Accept", "application/json");
    connection.setDoOutput(true);
    
  2. Enviar el cuerpo de la solicitud:

    String jsonInputString = "{\"title\": \"foo\", \"body\": \"bar\", \"userId\": 1}";
    
    try(OutputStream os = connection.getOutputStream()) {
        byte[] input = jsonInputString.getBytes("utf-8");
        os.write(input, 0, input.length);           
    }
    
  3. Leer la respuesta:

    if (responseCode == HttpURLConnection.HTTP_CREATED) {
        BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
        String inputLine;
        StringBuffer response = new StringBuffer();
    
        while ((inputLine = in.readLine()) != null) {
            response.append(inputLine);
        }
        in.close();
    
        System.out.println("Respuesta: " + response.toString());
    } else {
        System.out.println("Solicitud fallida");
    }
    

Conclusión

En este tema, hemos aprendido cómo trabajar con URLs y la clase HttpURLConnection en Java para realizar solicitudes HTTP. Hemos cubierto tanto solicitudes GET como POST, y cómo manejar las respuestas. Este conocimiento es esencial para interactuar con servicios web y APIs en tus aplicaciones Java.

En el siguiente módulo, exploraremos temas más avanzados relacionados con redes, como el uso de ServerSocket y DatagramSocket.

Curso de Programación en Java

Módulo 1: Introducción a Java

Módulo 2: Flujo de Control

Módulo 3: Programación Orientada a Objetos

Módulo 4: Programación Orientada a Objetos Avanzada

Módulo 5: Estructuras de Datos y Colecciones

Módulo 6: Manejo de Excepciones

Módulo 7: Entrada/Salida de Archivos

Módulo 8: Multihilo y Concurrencia

Módulo 9: Redes

Módulo 10: Temas Avanzados

Módulo 11: Frameworks y Librerías de Java

Módulo 12: Construcción de Aplicaciones del Mundo Real

© Copyright 2024. Todos los derechos reservados