Apache HttpClient - uwierzytelnianie serwera proxy

W tym rozdziale nauczymy się, jak utworzyć żądanie HttpRequest uwierzytelnione przy użyciu nazwy użytkownika i hasła oraz tunelować je przez proxy do hosta docelowego, korzystając z przykładu.

Krok 1 - Utwórz obiekt CredentialsProvider

Interfejs CredentialsProvider utrzymuje kolekcję przechowującą poświadczenia logowania użytkownika. Możesz utworzyć jego obiekt, tworząc wystąpienie klasy BasicCredentialsProvider, domyślnej implementacji tego interfejsu.

CredentialsProvider credentialsPovider = new BasicCredentialsProvider();

Krok 2 - Ustaw poświadczenia

Wymagane poświadczenia można ustawić dla obiektu CredentialsProvider przy użyciu setCredentials()metoda. Ta metoda akceptuje dwa obiekty -

  • AuthScope object - Zakres uwierzytelniania określający szczegóły, takie jak nazwa hosta, numer portu i nazwa schematu uwierzytelniania.

  • Credentials object- Określanie poświadczeń (nazwa użytkownika, hasło). Ustaw poświadczenia za pomocąsetCredentials() metoda dla hosta i serwera proxy, jak pokazano poniżej.

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

Krok 3 - Utwórz obiekt HttpClientBuilder

Stwórz HttpClientBuilder używając custom() metoda HttpClients klasa, jak pokazano poniżej -

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

Krok 4 - Ustaw CredentialsProvider

Obiekt CredentialsProvider można ustawić na obiekt HttpClientBuilder przy użyciu setDefaultCredentialsProvider()metoda. Przekaż wcześniej utworzonyCredentialsProvider sprzeciwić się tej metodzie.

clientbuilder = clientbuilder.setDefaultCredentialsProvider(credsProvider);

Krok 5 - Zbuduj plik CloseableHttpClient

Zbuduj CloseableHttpClient obiekt za pomocą build() metoda.

CloseableHttpClient httpclient = clientbuilder.build();

Krok 6 - Utwórz serwer proxy i hosty docelowe

Utwórz hosty docelowe i proxy, tworząc wystąpienie HttpHost klasa.

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

Krok 7 - Ustaw serwer proxy i utwórz obiekt RequestConfig

Stwórz RequestConfig.Builder obiekt za pomocą custom()metoda. Ustaw wcześniej utworzony obiekt proxyHost naRequestConfig.Builder używając setProxy()metoda. Na koniec skompilujRequestConfig obiekt za pomocą build() metoda.

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

Krok 8 - Utwórz obiekt żądania HttpGet i ustaw na niego obiekt konfiguracyjny.

Stwórz HttpGetobiektu, tworząc wystąpienie klasy HttpGet. Ustaw obiekt konfiguracyjny utworzony w poprzednim kroku na ten obiekt przy użyciusetConfig() metoda.

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

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

Krok 9 - Wykonaj żądanie

Wykonaj żądanie, przekazując obiekt HttpHost (cel) i żądanie (HttpGet) jako parametry do execute() metoda.

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

Przykład

Poniższy przykład pokazuje, jak wykonać żądanie HTTP za pośrednictwem serwera proxy przy użyciu nazwy użytkownika i hasł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());

   }
}

Wynik

Podczas wykonywania powyższy program generuje następujące dane wyjściowe -

HTTP/1.1 200 OK