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>