Apache HttpClient - Autenticación de proxy

En este capítulo, aprenderemos cómo crear una HttpRequest autenticada usando un nombre de usuario y contraseña y un túnel a través de un proxy a un host de destino, usando un ejemplo.

Paso 1: crear un objeto CredentialsProvider

La interfaz CredentialsProvider mantiene una colección para contener las credenciales de inicio de sesión del usuario. Puede crear su objeto creando una instancia de la clase BasicCredentialsProvider, la implementación predeterminada de esta interfaz.

CredentialsProvider credentialsPovider = new BasicCredentialsProvider();

Paso 2: establece las credenciales

Puede configurar las credenciales requeridas para el objeto CredentialsProvider usando el setCredentials()método. Este método acepta dos objetos:

  • AuthScope object - Alcance de autenticación que especifica los detalles como nombre de host, número de puerto y nombre del esquema de autenticación.

  • Credentials object- Especificando las credenciales (nombre de usuario, contraseña). Configure las credenciales con elsetCredentials() método para host y proxy como se muestra a continuación.

credsProvider.setCredentials(new AuthScope("example.com", 80), new
   UsernamePasswordCredentials("user", "mypass"));
credsProvider.setCredentials(new AuthScope("localhost", 8000), new
   UsernamePasswordCredentials("abc", "passwd"));

Paso 3: crea un objeto HttpClientBuilder

Crear un HttpClientBuilder utilizando la custom() método del HttpClients clase como se muestra a continuación -

//Creating the HttpClientBuilder
HttpClientBuilder clientbuilder = HttpClients.custom();

Paso 4: establecer el proveedor de credenciales

Puede establecer el objeto CredentialsProvider en un objeto HttpClientBuilder utilizando el setDefaultCredentialsProvider()método. Pasar el creado previamenteCredentialsProvider objetar este método.

clientbuilder = clientbuilder.setDefaultCredentialsProvider(credsProvider);

Paso 5: compila el CloseableHttpClient

Construye el CloseableHttpClient objeto usando el build() método.

CloseableHttpClient httpclient = clientbuilder.build();

Paso 6: cree el proxy y los hosts de destino

Cree los hosts de destino y proxy creando instancias de HttpHost clase.

//Creating the target and proxy hosts
HttpHost target = new HttpHost("example.com", 80, "http");
HttpHost proxy = new HttpHost("localhost", 8000, "http");

Paso 7: configura el proxy y crea un objeto RequestConfig

Crear un RequestConfig.Builder objeto usando el custom()método. Establezca el objeto proxyHost creado anteriormente en elRequestConfig.Builder utilizando la setProxy()método. Finalmente, construya elRequestConfig objeto usando el build() método.

RequestConfig.Builder reqconfigconbuilder= RequestConfig.custom();
reqconfigconbuilder = reqconfigconbuilder.setProxy(proxyHost);
RequestConfig config = reqconfigconbuilder.build();

Paso 8: cree un objeto de solicitud HttpGet y establezca el objeto de configuración en él.

Crear un HttpGetobjeto creando una instancia de la clase HttpGet. Establezca el objeto de configuración creado en el paso anterior a este objeto usando elsetConfig() método.

//Create the HttpGet request object
HttpGet httpGet = new HttpGet("/");

//Setting the config to the request
httpget.setConfig(config);

Paso 9: ejecutar la solicitud

Ejecute la solicitud pasando el objeto HttpHost (destino) y la solicitud (HttpGet) como parámetros al execute() método.

HttpResponse httpResponse = httpclient.execute(targetHost, httpget);

Ejemplo

El siguiente ejemplo demuestra cómo ejecutar una solicitud HTTP a través de un proxy utilizando un nombre de usuario y una contraseña.

import org.apache.http.HttpHost;
import org.apache.http.HttpResponse;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.client.HttpClients;

public class ProxyAuthenticationExample {
   public static void main(String[] args) throws Exception {

      //Creating the CredentialsProvider object
      CredentialsProvider credsProvider = new BasicCredentialsProvider();

      //Setting the credentials
      credsProvider.setCredentials(new AuthScope("example.com", 80), 
         new UsernamePasswordCredentials("user", "mypass"));
      credsProvider.setCredentials(new AuthScope("localhost", 8000), 
         new UsernamePasswordCredentials("abc", "passwd"));

      //Creating the HttpClientBuilder
      HttpClientBuilder clientbuilder = HttpClients.custom();

      //Setting the credentials
      clientbuilder = clientbuilder.setDefaultCredentialsProvider(credsProvider);
      
      //Building the CloseableHttpClient object
      CloseableHttpClient httpclient = clientbuilder.build();


      //Create the target and proxy hosts
      HttpHost targetHost = new HttpHost("example.com", 80, "http");
      HttpHost proxyHost = new HttpHost("localhost", 8000, "http");

      //Setting the proxy
      RequestConfig.Builder reqconfigconbuilder= RequestConfig.custom();
      reqconfigconbuilder = reqconfigconbuilder.setProxy(proxyHost);
      RequestConfig config = reqconfigconbuilder.build();

      //Create the HttpGet request object
      HttpGet httpget = new HttpGet("/");

      //Setting the config to the request
      httpget.setConfig(config);
 
      //Printing the status line
      HttpResponse response = httpclient.execute(targetHost, httpget);
      System.out.println(response.getStatusLine());

   }
}

Salida

Al ejecutarse, el programa anterior genera la siguiente salida:

HTTP/1.1 200 OK