Apache HttpClient: uso de proxy

Un servidor proxy es un servidor intermediario entre el cliente e Internet. Los servidores proxy ofrecen las siguientes funcionalidades básicas:

  • Filtrado de datos de red y firewall

  • Compartir conexión de red

  • Almacenamiento en caché de datos

Con la biblioteca HttpClient, puede enviar una solicitud HTTP mediante un proxy. Siga los pasos que se indican a continuación:

Paso 1: crea un objeto HttpHost

Instancia del HttpHost clase de la org.apache.http package pasando un parámetro de cadena que representa el nombre del host proxy (desde el cual necesita que se envíen las solicitudes) a su constructor.

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

De la misma manera, cree otro objeto HttpHost para representar el host de destino al que se deben enviar las solicitudes.

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

Paso 2: crea un objeto HttpRoutePlanner

los HttpRoutePlannerLa interfaz calcula una ruta a un host especificado. Cree un objeto de esta interfaz instanciando elDefaultProxyRoutePlannerclass, una implementación de esta interfaz. Como parámetro para su constructor, pase el host proxy creado anteriormente:

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

Paso 3: configura el planificador de rutas para un creador de clientes

Utilizando la custom() método del HttpClients clase, crea una HttpClientBuilder objeto y, en este objeto, establezca el planificador de ruta creado anteriormente, utilizando el setRoutePlanner() método.

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

clientBuilder = clientBuilder.setRoutePlanner(routePlanner);

Paso 4: compila el objeto CloseableHttpClient

Construye el CloseableHttpClient objeto llamando al build() método.

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

Paso 5 - Crea un HttpGetobject

Cree una solicitud HTTP GET creando una instancia del HttpGet clase.

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

Paso 6: ejecutar la solicitud

Una de las variantes del execute() el método acepta un HttpHost y HttpRequestobjetos y ejecuta la solicitud. Ejecute la solicitud utilizando este método:

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

Ejemplo

El siguiente ejemplo demuestra cómo enviar una solicitud HTTP a un servidor a través de un proxy. En este ejemplo, estamos enviando una solicitud HTTP GET a google.com a través de localhost. Hemos impreso los encabezados de la respuesta y el cuerpo de la respuesta.

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

Salida

Al ejecutarse, el programa anterior genera la siguiente salida:

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>