Apache HttpClient - Utilizzo di Proxy

Un server proxy è un server intermedio tra il client e Internet. I server proxy offrono le seguenti funzionalità di base:

  • Firewall e filtraggio dei dati di rete

  • Condivisione della connessione di rete

  • Memorizzazione nella cache dei dati

Utilizzando la libreria HttpClient, è possibile inviare una richiesta HTTP utilizzando un proxy. Segui i passaggi indicati di seguito:

Passaggio 1: creare un oggetto HttpHost

Istanziare il file HttpHost classe di org.apache.http pacchetto passando un parametro stringa che rappresenta il nome dell'host proxy, (da cui è necessario inviare le richieste) al suo costruttore.

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

Allo stesso modo, crea un altro oggetto HttpHost per rappresentare l'host di destinazione a cui devono essere inviate le richieste.

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

Passaggio 2: creare un oggetto HttpRoutePlanner

Il HttpRoutePlannerl'interfaccia calcola un percorso verso un host specificato. Crea un oggetto di questa interfaccia istanziando il fileDefaultProxyRoutePlannerclass, un'implementazione di questa interfaccia. Come parametro per il suo costruttore, passa l'host proxy creato sopra -

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

Passaggio 3: impostare il pianificatore di percorso su un costruttore del cliente

Usando il custom() metodo del HttpClients class, crea un file HttpClientBuilder oggetto e, a questo oggetto, impostare il pianificatore di percorso creato sopra, utilizzando il setRoutePlanner() metodo.

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

clientBuilder = clientBuilder.setRoutePlanner(routePlanner);

Passaggio 4: creare l'oggetto CloseableHttpClient

Costruisci il file CloseableHttpClient oggetto chiamando il build() metodo.

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

Passaggio 5: creare un oggetto HttpGetobject

Crea una richiesta HTTP GET istanziando il file HttpGet classe.

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

Passaggio 6: eseguire la richiesta

Una delle varianti di execute() metodo accetta un file HttpHost e HttpRequestoggetti ed esegue la richiesta. Esegui la richiesta utilizzando questo metodo -

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

Esempio

L'esempio seguente mostra come inviare una richiesta HTTP a un server tramite proxy. In questo esempio, stiamo inviando una richiesta HTTP GET a google.com tramite localhost. Abbiamo stampato le intestazioni della risposta e il corpo della risposta.

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

Produzione

In esecuzione, il programma precedente genera il seguente output:

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>