Consumir servicios Rest con Apache HttpClient

Apache HttpClient es una biblioteca popular de Java que proporciona paquetes potentes y ricos en funciones que implementan los últimos estándares y recomendaciones HTTP en el lado del cliente. Está diseñado para ser extensible al mismo tiempo que proporciona un fuerte soporte para el protocolo HTTP subyacente. Proporciona componentes para la autenticación del lado del cliente, la gestión de la conexión y la gestión del estado, entre otras funciones. También es compatible con HTTP/2 y WebSocket. En este artículo se demostrará como consumir servicios Rest con Apache HttpClient.

Principales características de Apache HttpClient

Las características clave incluyen:

  • Sólida compatibilidad con HTTP: Apache HttpClient brinda compatibilidad con los últimos estándares y recomendaciones de HTTP, incluidos HTTP/2 y WebSocket.
  • Gestión de conexiones: Apache HttpClient proporciona un potente sistema para gestionar conexiones y reutilizarlas para solicitudes posteriores.
  • Autenticación del lado del cliente: Apache HttpClient admite la autenticación del lado del cliente, lo que le permite usar muchos esquemas de autenticación diferentes.
  • Administración de estado: Apache HttpClient tiene varias funciones de administración de estado del lado del cliente, como cookies y encabezados de solicitud HTTP.
  • Extensibilidad: Apache HttpClient está diseñado teniendo en cuenta la extensibilidad, lo que permite a los desarrolladores agregar características y funciones personalizadas.

Creación de un cliente HTTP

Este artículo proporciona algunos ejemplos introductorios a la utilización de la biblioteca Apache HttpClient, cubriendo algunos conceptos básicos del uso de la biblioteca, de manera de dar una base para una mayor exploración de sus funcionalidades.

Crearemos el proyecto Java utilizando un arquetipo de Maven e importaremos el proyecto en Eclipse, como se explica en el siguiente artículo:

Una vez creado el proyecto abriremos el archivo pom.xml y agregaremos la dependencia de HttpClient 5:

<dependency>
    <groupId>org.apache.httpcomponents.client5</groupId>
    <artifactId>httpclient5</artifactId>
    <version>5.2</version>
</dependency>

En el siguiente apartado se demostrará la forma de implementar llamadas a servicios GET y POST. Para este ejemplo se utilizaron los servicios creados en el siguiente artículo:

Consumir servicios con HttpClient

Crear una petición GET

Para crear una solicitud GET con Apache HttpClient, puede usar la clase HttpGet. Aquí hay un ejemplo de cómo hacer una solicitud GET para obtener algunos datos de un servidor:

package com.jcodepoint;

import java.io.IOException;

import org.apache.hc.client5.http.classic.methods.HttpGet;
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse;
import org.apache.hc.client5.http.impl.classic.HttpClients;
import org.apache.hc.core5.http.HttpEntity;
import org.apache.hc.core5.http.ParseException;
import org.apache.hc.core5.http.io.entity.EntityUtils;

public class App {
    public static void main( String[] args ) {
        CloseableHttpClient httpClient = null;
        CloseableHttpResponse response = null;
        HttpEntity entity = null;        
        String result = null;
        
        String url = "http://localhost:8080/customer";
        HttpGet httpGet = new HttpGet(url);
        httpClient = HttpClients.createDefault();

        try {
        	//Ejecutar y obtener la respuesta.
        	response = httpClient.execute(httpGet);
        	entity = response.getEntity();
        	
        	//Leer el contenido de una entidad y retornarlo como una cadena.
        	result = EntityUtils.toString(entity);
        } catch(ParseException | IOException e) {
        	System.out.println("-> " + e.getClass().getName());
        	return;
        }
        
        System.out.println("-> Result: " + result);
    }
}

Crear una petición POST

Al igual que en el ejemplo anterior, para crear una solicitud POST con Apache HttpClient, también puede hacerlo usando la clase HttpPost. Aquí hay un ejemplo de cómo hacer una solicitud POST para enviar algunos datos a un servidor:

package com.jcodepoint;

import java.io.IOException;

import org.apache.hc.client5.http.classic.methods.HttpPost;
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse;
import org.apache.hc.client5.http.impl.classic.HttpClients;
import org.apache.hc.core5.http.io.entity.StringEntity;

public class App {
    public static void main( String[] args ) {
        CloseableHttpClient httpClient = null;
        CloseableHttpResponse response = null;
        Integer status = null;

        String customer = "{\"id\":2,\"firstName\":\"Pedro\",\"lastName\":\"Lopez\",\"location\":\"CABA\"}";
        StringEntity customerEntity = new StringEntity(customer);

        String url = "http://localhost:8080/customer";
        HttpPost httpPost = new HttpPost(url);
        httpPost.setHeader("Accept", "application/json");
        httpPost.setHeader("Content-type", "application/json");
        httpPost.setEntity(customerEntity);
        httpClient = HttpClients.createDefault();

        
        try {
        	//Ejecutar y obtener la respuesta.
        	response = httpClient.execute(httpPost);
        	status = response.getCode();
        } catch(IOException e) {
        	System.out.println("-> " + e.getClass().getName());
        	return;
        }
        
        System.out.println("-> Status: " + String.valueOf(status));
    }
    
}

Agregar encabezados a una petición

Para agregar un encabezado a una solicitud en Apache HttpClient, puede usar el método addHeader(String, Object) o bien el método setHeader(String, Object).

Estos métodos toman dos argumentos: una cadena que representa el nombre del encabezado y una cadena que representa el valor del encabezado. Por ejemplo, para agregar un encabezado llamado «User-Agent» con el valor «Java 11 HttpClient Bot«, puede usar el siguiente código:

HttpRequestBase request = new HttpRequestBase(); 
request.addHeader("User-Agent", "Java 11 HttpClient Bot");

La diferencia entre ambos métodos es la siguiente:

  • addHeader(String, Object): agrega el encabezado a la petición posicionándolo al final de la lista.
  • setHeader(String, Object): si el encabezado que se está agregando ya existe la sobreescribe. De no existir lo agrega al final de la lista.

Una vez que se agrega el encabezado a la solicitud, se puede enviar al servidor llamando al método execute().

Agregar parámetros a una petición

Al consumir servicios con HttpClient podemos agregar parámetros usando el método addParameter(String, String) de la clase URIBuilder, que le permite establecer el parámetro con un nombre y valor específicos. Aquí hay un ejemplo:

        String url = "http://localhost:8080/customer";
        HttpGet httpGet = new HttpGet(url);
        
        try {
	        URI uri = new URIBuilder(httpGet.getUri())
	        			.addParameter("name", "value")
	        			.build();
	        
	        httpGet.setUri(uri);
        } catch(URISyntaxException e) {
        	//...
        }

Una vez que se agrega el parámetro a la solicitud, se puede enviar al servidor llamando al método execute().

Procesar resultados

Para procesar una respuesta en HttpClient 5, puede usar el método HttpResponse.getEntity() para obtener el cuerpo de la respuesta como una Entidad. Luego puede usar el método EntityUtils.toString() para convertir el cuerpo de la respuesta en una cadena. Aquí hay un ejemplo:

HttpResponse response = httpClient.execute(request);
String responseBody = EntityUtils.toString(response.getEntity());
// procesar responseBody

Si el cuerpo de la respuesta está en un formato diferente, como JSON, puede usar una biblioteca de analizador JSON como Jackson o Gson para analizar el cuerpo de la respuesta en un objeto Java.

Conclusión

En conclusión, Apache HTTPClient es una biblioteca poderosa y confiable para realizar solicitudes HTTP. Permite a los desarrolladores crear fácilmente solicitudes con encabezados y parámetros personalizados, así como realizar varias operaciones CRUD en servicios web. Además, proporciona una manera fácil de probar los servicios en línea y descargar archivos como imágenes y PDF. Apache HTTPClient es una buena opción para los desarrolladores que desean enviar solicitudes HTTP de manera rápida y confiable.


Te puede interesar

Crear microservicios con Spring Boot

En este artículo cubriremos los pasos necesarios para crear microservicios con Spring Boot, desplegarlo y acceder a los endpoints.

Seguir leyendo →

Testear Rest API con WebTestClient

En este artículo veremos la forma de testear una Rest API con WebTestClient, que nos permitirá realizar peticiones y verificar resultados.

Seguir leyendo →

Palabras reservadas en Java

Las palabras reservadas en Java son un componente crucial de la sintaxis del lenguaje para formar los bloques básicos del lenguaje.

Seguir leyendo →

Convenciones de nombres en API Rest

Las convenciones de nombres en API REST son fundamentales para facilitar la comprensión de cómo interactuar con la API.

Seguir leyendo →