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 HttpHost và HttpRequestđố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>