Apache HttpClient - Interceptores

Los interceptores son aquellos que ayudan a obstruir o cambiar solicitudes o respuestas. Los interceptores de protocolo en general actúan sobre un encabezado específico o un grupo de encabezados relacionados. La biblioteca HttpClient proporciona soporte para interceptores.

Solicitar interceptor

los HttpRequestInterceptorLa interfaz representa los interceptores de solicitudes. Esta interfaz contiene un método conocido como proceso en el que debe escribir el fragmento de código para interceptar las solicitudes.

En el lado del cliente, este método verifica / procesa las solicitudes antes de enviarlas al servidor y, en el lado del servidor, este método se ejecuta antes de evaluar el cuerpo de la solicitud.

Creando un interceptor de solicitudes

Puede crear un interceptor de solicitudes siguiendo los pasos que se indican a continuación.

Step 1 - Create an object of HttpRequestInterceptor

Cree un objeto de la interfaz HttpRequestInterceptor implementando su proceso de método abstracto.

HttpRequestInterceptor requestInterceptor = new HttpRequestInterceptor() {
@Override
 public void process(HttpRequest request, HttpContext context) throws
HttpException, IOException {
   //Method implementation . . . . .
};

Step 2 - Instantiate CloseableHttpClient object

Crea una personalizada CloseableHttpClient objeto agregando el interceptor creado anteriormente como se muestra a continuación:

//Creating a CloseableHttpClient object
CloseableHttpClient httpclient =
HttpClients.custom().addInterceptorFirst(requestInterceptor).build();

Con este objeto, puede realizar las ejecuciones de solicitudes como de costumbre.

Ejemplo

El siguiente ejemplo demuestra el uso de interceptores de solicitudes. En este ejemplo, hemos creado un objeto de solicitud HTTP GET y le hemos agregado tres encabezados: sample-header, demoheader y test-header.

En el processor()método del interceptor, estamos verificando los encabezados de la solicitud enviada; si alguno de esos encabezados essample-header, estamos intentando eliminarlo y mostrar la lista de encabezados de esa solicitud en particular.

import java.io.IOException;
import org.apache.http.Header;
import org.apache.http.HttpException;
import org.apache.http.HttpRequest;
import org.apache.http.HttpRequestInterceptor;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicHeader;
import org.apache.http.protocol.HttpContext;

public class InterceptorsExample {
 
   public static void main(String args[]) throws Exception{
      
      //Creating an HttpRequestInterceptor
      HttpRequestInterceptor requestInterceptor = new HttpRequestInterceptor() {
         @Override
         public void process(HttpRequest request, HttpContext context) throws
         HttpException, IOException {
            if(request.containsHeader("sample-header")) {
               System.out.println("Contains header sample-header, removing it..");
               request.removeHeaders("sample-header"); 
            }
            //Printing remaining list of headers
            Header[] headers= request.getAllHeaders();
            for (int i = 0; i<headers.length;i++) {
               System.out.println(headers[i].getName());
            }
         }
      };

      //Creating a CloseableHttpClient object
      CloseableHttpClient httpclient =
      HttpClients.custom().addInterceptorFirst(requestInterceptor).build();

      //Creating a request object
      HttpGet httpget1 = new HttpGet("https://www.tutorialspoint.com/");

      //Setting the header to it
      httpget1.setHeader(new BasicHeader("sample-header","My first header"));
      httpget1.setHeader(new BasicHeader("demo-header","My second header"));
      httpget1.setHeader(new BasicHeader("test-header","My third header"));

      //Executing the request
      HttpResponse httpresponse = httpclient.execute(httpget1);

      //Printing the status line
      System.out.println(httpresponse.getStatusLine());
   }
}

Salida

Al ejecutar el programa anterior, se genera la siguiente salida:

Contains header sample-header, removing it..
demo-header
test-header
HTTP/1.1 200 OK

Interceptor de respuesta

los HttpResponseInterceptorLa interfaz representa los interceptores de respuesta. Esta interfaz contiene un método conocido comoprocess(). En este método, debe escribir el fragmento de código para interceptar las respuestas.

En el lado del servidor, este método verifica / procesa la respuesta antes de enviarla al cliente, y en el lado del cliente, este método se ejecuta antes de evaluar el cuerpo de la respuesta.

Creando interceptor de respuesta

Puede crear un interceptor de respuesta siguiendo los pasos que se indican a continuación:

Step 1 - Create an object of HttpResponseInterceptor

Crea un objeto del HttpResponseInterceptor interfaz implementando su método abstracto process.

HttpResponseInterceptor responseInterceptor = new HttpResponseInterceptor() {
   @Override
   public void process(HttpResponse response, HttpContext context) throws HttpException, IOException {
      //Method implementation . . . . . . . .
   }
};

Paso 2: crear una instancia del objeto CloseableHttpClient

Crea una personalizada CloseableHttpClient objeto agregando el interceptor creado anteriormente, como se muestra a continuación:

//Creating a CloseableHttpClient object
CloseableHttpClient httpclient =
HttpClients.custom().addInterceptorFirst(responseInterceptor).build();

Con este objeto, puede realizar las ejecuciones de solicitudes como de costumbre.

Ejemplo

El siguiente ejemplo demuestra el uso de interceptores de respuesta. En este ejemplo, hemos agregado tres encabezados: sample-header, demo-header y test-header a la respuesta en el procesador.

Después de ejecutar la solicitud y obtener la respuesta, imprimimos los nombres de todos los encabezados de la respuesta utilizando el getAllHeaders() método.

Y en la salida, puede observar los nombres de tres encabezados en la lista.

import java.io.IOException;
import org.apache.http.Header;
import org.apache.http.HttpException;
import org.apache.http.HttpResponse;
import org.apache.http.HttpResponseInterceptor;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.protocol.HttpContext;

public class ResponseInterceptorsExample {

   public static void main(String args[]) throws Exception{
      
      //Creating an HttpRequestInterceptor
      HttpResponseInterceptor responseInterceptor = new HttpResponseInterceptor() {
         @Override
         public void process(HttpResponse response, HttpContext context) throws
         HttpException, IOException {
            System.out.println("Adding header sample_header, demo-header, test_header to the response");
            response.setHeader("sample-header", "My first header");
            response.setHeader("demo-header", "My second header");
            response.setHeader("test-header", "My third header"); 
         }
      };

      //Creating a CloseableHttpClient object
      CloseableHttpClient httpclient = HttpClients.custom().addInterceptorFirst(responseInterceptor).build();

      //Creating a request object
      HttpGet httpget1 = new HttpGet("https://www.tutorialspoint.com/");

      //Executing the request
      HttpResponse httpresponse = httpclient.execute(httpget1); 

      //Printing remaining list of headers
      Header[] headers = httpresponse.getAllHeaders();
 
      for (int i = 0; i<headers.length;i++) {
         System.out.println(headers[i].getName());
      }
   }
}

Salida

Al ejecutarse, el programa anterior genera el siguiente resultado:

On executing the above program generates the following output.
Adding header sample_header, demo-header, test_header to the response
Accept-Ranges
Access-Control-Allow-Headers
Access-Control-Allow-Origin
Cache-Control
Content-Type
Date
Expires
Last-Modified
Server
Vary
X-Cache
sample-header
demo-header
test-header