Apache HttpClient - Sử dụng Proxy

Máy chủ Proxy là một máy chủ trung gian giữa máy khách và internet. Máy chủ proxy cung cấp các chức năng cơ bản sau:

  • Tường lửa và lọc dữ liệu mạng

  • Chia sẻ kết nối mạng

  • Bộ nhớ đệm dữ liệu

Sử dụng thư viện HttpClient, bạn có thể gửi một yêu cầu HTTP bằng proxy. Làm theo các bước dưới đây -

Bước 1 - Tạo một đối tượng HttpHost

Khởi tạo HttpHost lớp của org.apache.http gói bằng cách chuyển một tham số chuỗi đại diện cho tên của máy chủ proxy, (từ đó bạn cần gửi các yêu cầu) tới phương thức khởi tạo của nó.

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

Theo cách tương tự, hãy tạo một đối tượng HttpHost khác để đại diện cho máy chủ đích mà các yêu cầu cần được gửi đến.

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

Bước 2 - Tạo đối tượng HttpRoutePlanner

Các HttpRoutePlannergiao diện tính toán một tuyến đường đến một máy chủ được chỉ định. Tạo một đối tượng của giao diện này bằng cách khởi tạoDefaultProxyRoutePlannerlớp, một triển khai của giao diện này. Là một tham số cho hàm tạo của nó, hãy chuyển máy chủ proxy đã tạo ở trên -

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

Bước 3 - Đặt công cụ lập kế hoạch lộ trình thành công cụ tạo khách hàng

Sử dụng custom() phương pháp của HttpClients lớp học, tạo một HttpClientBuilder đối tượng và đối tượng này đặt công cụ lập kế hoạch tuyến đường đã tạo ở trên, sử dụng setRoutePlanner() phương pháp.

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

clientBuilder = clientBuilder.setRoutePlanner(routePlanner);

Bước 4 - Xây dựng đối tượng ClosableHttpClient

Xây dựng CloseableHttpClient đối tượng bằng cách gọi build() phương pháp.

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

Bước 5 - Tạo HttpGetobject

Tạo một yêu cầu HTTP GET bằng cách khởi tạo HttpGet lớp học.

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

Bước 6 - Thực hiện yêu cầu

Một trong những biến thể của execute() phương thức chấp nhận một HttpHostHttpRequestđối tượng và thực hiện yêu cầu. Thực thi yêu cầu bằng phương pháp này -

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

Thí dụ

Ví dụ sau minh họa cách gửi một yêu cầu HTTP đến một máy chủ qua proxy. Trong ví dụ này, chúng tôi đang gửi một yêu cầu HTTP GET đến google.com thông qua localhost. Chúng tôi đã in tiêu đề của phản hồi và nội dung của phản hồi.

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

Đầu ra

Khi thực thi, chương trình trên tạo ra kết quả sau:

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>