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