Apache HttpClient - Intercepteurs

Les intercepteurs sont ceux qui aident à obstruer ou à modifier les demandes ou les réponses. Les intercepteurs de protocole agissent en général sur un en-tête spécifique ou un groupe d'en-têtes associés. La bibliothèque HttpClient prend en charge les intercepteurs.

Demander un intercepteur

le HttpRequestInterceptorinterface représente les intercepteurs de demande. Cette interface contient une méthode connue sous le nom de processus dans lequel vous devez écrire le morceau de code pour intercepter les requêtes.

Côté client, cette méthode vérifie / traite les requêtes avant de les envoyer au serveur et, côté serveur, cette méthode est exécutée avant d'évaluer le corps de la requête.

Création d'un intercepteur de demande

Vous pouvez créer un intercepteur de demande en suivant les étapes ci-dessous.

Step 1 - Create an object of HttpRequestInterceptor

Créez un objet de l'interface HttpRequestInterceptor en implémentant son processus de méthode abstraite.

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

Step 2 - Instantiate CloseableHttpClient object

Construire une personnalisation CloseableHttpClient objet en lui ajoutant l'intercepteur créé ci-dessus comme indiqué ci-dessous -

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

À l'aide de cet objet, vous pouvez effectuer les exécutions de requêtes comme d'habitude.

Exemple

L'exemple suivant montre l'utilisation des intercepteurs de demande. Dans cet exemple, nous avons créé un objet de requête HTTP GET et ajouté trois en-têtes: exemple-en-tête, démo-en-tête et test-en-tête.

dans le processor()méthode de l'intercepteur, nous vérifions les en-têtes de la requête envoyée; si l'un de ces en-têtes estsample-header, nous essayons de le supprimer et d'afficher la liste des en-têtes de cette requête particulière.

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());
   }
}

Production

Lors de l'exécution du programme ci-dessus, la sortie suivante est générée -

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

Intercepteur de réponse

le HttpResponseInterceptorinterface représente les intercepteurs de réponse. Cette interface contient une méthode appeléeprocess(). Dans cette méthode, vous devez écrire le morceau de code pour intercepter les réponses.

Côté serveur, cette méthode vérifie / traite la réponse avant de l'envoyer au client, et côté client, cette méthode est exécutée avant d'évaluer le corps de la réponse.

Créer un intercepteur de réponse

Vous pouvez créer un intercepteur de réponse en suivant les étapes ci-dessous -

Step 1 - Create an object of HttpResponseInterceptor

Créez un objet du HttpResponseInterceptor interface en implémentant sa méthode abstraite process.

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

Étape 2: instancier l'objet CloseableHttpClient

Construire une personnalisation CloseableHttpClient objet en y ajoutant l'intercepteur créé ci-dessus, comme indiqué ci-dessous -

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

À l'aide de cet objet, vous pouvez effectuer les exécutions de requêtes comme d'habitude.

Exemple

L'exemple suivant illustre l'utilisation des intercepteurs de réponse. Dans cet exemple, nous avons ajouté trois en-têtes: sample-header, demo-header et test-header à la réponse dans le processeur.

Après avoir exécuté la requête et obtenu la réponse, nous avons imprimé les noms de tous les en-têtes de la réponse en utilisant le getAllHeaders() méthode.

Et dans la sortie, vous pouvez observer les noms de trois en-têtes dans la liste.

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());
      }
   }
}

Production

Lors de l'exécution, le programme ci-dessus génère le résultat suivant -

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