Apache HttpClient - Utilisation du proxy

Un serveur proxy est un serveur intermédiaire entre le client et Internet. Les serveurs proxy offrent les fonctionnalités de base suivantes -

  • Pare-feu et filtrage des données réseau

  • Partage de connexion réseau

  • Mise en cache des données

À l'aide de la bibliothèque HttpClient, vous pouvez envoyer une requête HTTP à l'aide d'un proxy. Suivez les étapes ci-dessous -

Étape 1 - Créer un objet HttpHost

Instancier le HttpHost classe de la org.apache.http package en passant un paramètre de chaîne représentant le nom de l'hôte proxy, (à partir duquel vous devez envoyer les requêtes) à son constructeur.

//Creating an HttpHost object for proxy
HttpHost proxyHost = new HttpHost("localhost");

De la même manière, créez un autre objet HttpHost pour représenter l'hôte cible auquel les demandes doivent être envoyées.

//Creating an HttpHost object for target
HttpHost targetHost = new HttpHost("google.com");

Étape 2 - Créez un objet HttpRoutePlanner

le HttpRoutePlannerinterface calcule une route vers un hôte spécifié. Créez un objet de cette interface en instanciant leDefaultProxyRoutePlannerclass, une implémentation de cette interface. En tant que paramètre à son constructeur, passez l'hôte proxy créé ci-dessus -

//creating a RoutePlanner object
HttpRoutePlanner routePlanner = new DefaultProxyRoutePlanner(proxyhost);

Étape 3 - Définissez le planificateur d'itinéraire sur un constructeur client

En utilisant le custom() méthode de la HttpClients classe, créez un HttpClientBuilder et, sur cet objet, définissez le planificateur d'itinéraire créé ci-dessus, setRoutePlanner() méthode.

//Setting the route planner to the HttpClientBuilder object
HttpClientBuilder clientBuilder = HttpClients.custom();

clientBuilder = clientBuilder.setRoutePlanner(routePlanner);

Étape 4 - Construisez l'objet CloseableHttpClient

Construisez le CloseableHttpClient objet en appelant le build() méthode.

//Building a CloseableHttpClient
CloseableHttpClient httpClient = clientBuilder.build();

Étape 5 - Créer un HttpGetobject

Créez une requête HTTP GET en instanciant le HttpGet classe.

//Creating an HttpGet object
HttpGet httpGet = new HttpGet("/");

Étape 6 - Exécutez la demande

L'une des variantes du execute() méthode accepte un HttpHost et HttpRequestobjets et exécute la requête. Exécutez la requête en utilisant cette méthode -

//Executing the Get request
HttpResponse httpResponse = httpclient.execute(targetHost, httpGet);

Exemple

L'exemple suivant montre comment envoyer une requête HTTP à un serveur via un proxy. Dans cet exemple, nous envoyons une requête HTTP GET à google.com via localhost. Nous avons imprimé les en-têtes de la réponse et le corps de la réponse.

import org.apache.http.Header;
import org.apache.http.HttpEntity;
import org.apache.http.HttpHost;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.conn.routing.HttpRoutePlanner;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.DefaultProxyRoutePlanner;
import org.apache.http.util.EntityUtils;

public class RequestViaProxyExample {

   public static void main(String args[]) throws Exception{
 
      //Creating an HttpHost object for proxy
      HttpHost proxyhost = new HttpHost("localhost");

      //Creating an HttpHost object for target
      HttpHost targethost = new HttpHost("google.com");
 
      //creating a RoutePlanner object
      HttpRoutePlanner routePlanner = new DefaultProxyRoutePlanner(proxyhost);

      //Setting the route planner to the HttpClientBuilder object
      HttpClientBuilder clientBuilder = HttpClients.custom();
      clientBuilder = clientBuilder.setRoutePlanner(routePlanner);

      //Building a CloseableHttpClient
      CloseableHttpClient httpclient = clientBuilder.build();

      //Creating an HttpGet object
      HttpGet httpget = new HttpGet("/");

      //Executing the Get request
      HttpResponse httpresponse = httpclient.execute(targethost, httpget);

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

      //Printing all the headers of the response
      Header[] headers = httpresponse.getAllHeaders();
 
      for (int i = 0; i < headers.length; i++) {
         System.out.println(headers[i]);
      }
      
      //Printing the body of the response
      HttpEntity entity = httpresponse.getEntity();

      if (entity != null) {
         System.out.println(EntityUtils.toString(entity));
      }
   }
}

Production

Lors de l'exécution, le programme ci-dessus génère la sortie suivante -

HTTP/1.1 200 OK
Date: Sun, 23 Dec 2018 10:21:47 GMT
Server: Apache/2.4.9 (Win64) PHP/5.5.13
Last-Modified: Tue, 24 Jun 2014 10:46:24 GMT
ETag: "2e-4fc92abc3c000"
Accept-Ranges: bytes
Content-Length: 46
Content-Type: text/html
<html><body><h1>It works!</h1></body></html>