Apache HttpClient - Bộ đánh chặn

Các thiết bị chặn là những thứ giúp cản trở hoặc thay đổi các yêu cầu hoặc phản hồi. Các bộ chặn giao thức nói chung hoạt động dựa trên một tiêu đề cụ thể hoặc một nhóm các tiêu đề liên quan. Thư viện HttpClient cung cấp hỗ trợ cho các trình đánh chặn.

Yêu cầu đánh chặn

Các HttpRequestInterceptorgiao diện đại diện cho các bộ chặn yêu cầu. Giao diện này chứa một phương thức được gọi là một quy trình trong đó bạn cần viết đoạn mã để chặn các yêu cầu.

Về phía máy khách, phương pháp này xác minh / xử lý các yêu cầu trước khi gửi chúng đến máy chủ và ở phía máy chủ, phương thức này được thực thi trước khi đánh giá nội dung của yêu cầu.

Tạo trình chặn yêu cầu

Bạn có thể tạo một trình chặn yêu cầu bằng cách làm theo các bước dưới đây.

Step 1 - Create an object of HttpRequestInterceptor

Tạo một đối tượng của giao diện HttpRequestInterceptor bằng cách thực hiện quy trình phương thức trừu tượng của nó.

HttpRequestInterceptor requestInterceptor = new HttpRequestInterceptor() {
@Override
 public void process(HttpRequest request, HttpContext context) throws
HttpException, IOException {
   //Method implementation . . . . .
};

Step 2 - Instantiate CloseableHttpClient object

Xây dựng một tùy chỉnh CloseableHttpClient đối tượng bằng cách thêm bộ chặn đã tạo ở trên vào nó như hình dưới đây -

//Creating a CloseableHttpClient object
CloseableHttpClient httpclient =
HttpClients.custom().addInterceptorFirst(requestInterceptor).build();

Sử dụng đối tượng này, bạn có thể thực hiện các yêu cầu như bình thường.

Thí dụ

Ví dụ sau minh họa việc sử dụng các bộ chặn yêu cầu. Trong ví dụ này, chúng tôi đã tạo một đối tượng yêu cầu HTTP GET và thêm ba tiêu đề: tiêu đề mẫu, tiêu đề trình diễn và tiêu đề thử nghiệm vào nó.

bên trong processor()phương pháp của trình đánh chặn, chúng tôi đang xác minh các tiêu đề của yêu cầu được gửi; nếu bất kỳ tiêu đề nào trong số đó làsample-header, chúng tôi đang cố gắng xóa nó và hiển thị danh sách các tiêu đề của yêu cầu cụ thể đó.

import java.io.IOException;
import org.apache.http.Header;
import org.apache.http.HttpException;
import org.apache.http.HttpRequest;
import org.apache.http.HttpRequestInterceptor;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicHeader;
import org.apache.http.protocol.HttpContext;

public class InterceptorsExample {
 
   public static void main(String args[]) throws Exception{
      
      //Creating an HttpRequestInterceptor
      HttpRequestInterceptor requestInterceptor = new HttpRequestInterceptor() {
         @Override
         public void process(HttpRequest request, HttpContext context) throws
         HttpException, IOException {
            if(request.containsHeader("sample-header")) {
               System.out.println("Contains header sample-header, removing it..");
               request.removeHeaders("sample-header"); 
            }
            //Printing remaining list of headers
            Header[] headers= request.getAllHeaders();
            for (int i = 0; i<headers.length;i++) {
               System.out.println(headers[i].getName());
            }
         }
      };

      //Creating a CloseableHttpClient object
      CloseableHttpClient httpclient =
      HttpClients.custom().addInterceptorFirst(requestInterceptor).build();

      //Creating a request object
      HttpGet httpget1 = new HttpGet("https://www.tutorialspoint.com/");

      //Setting the header to it
      httpget1.setHeader(new BasicHeader("sample-header","My first header"));
      httpget1.setHeader(new BasicHeader("demo-header","My second header"));
      httpget1.setHeader(new BasicHeader("test-header","My third header"));

      //Executing the request
      HttpResponse httpresponse = httpclient.execute(httpget1);

      //Printing the status line
      System.out.println(httpresponse.getStatusLine());
   }
}

Đầu ra

Khi thực hiện chương trình trên, kết quả sau được tạo:

Contains header sample-header, removing it..
demo-header
test-header
HTTP/1.1 200 OK

Máy đánh chặn phản ứng

Các HttpResponseInterceptorgiao diện đại diện cho các bộ đánh chặn phản ứng. Giao diện này chứa một phương thức được gọi làprocess(). Trong phương pháp này, bạn cần viết đoạn mã để chặn các phản hồi.

Ở phía máy chủ, phương pháp này xác minh / xử lý phản hồi trước khi gửi chúng đến máy khách và ở phía máy khách, phương thức này được thực thi trước khi đánh giá nội dung của phản hồi.

Tạo bộ đánh chặn phản hồi

Bạn có thể tạo một bộ đánh chặn phản hồi bằng cách làm theo các bước dưới đây:

Step 1 - Create an object of HttpResponseInterceptor

Tạo một đối tượng của HttpResponseInterceptor giao diện bằng cách triển khai phương thức trừu tượng của nó process.

HttpResponseInterceptor responseInterceptor = new HttpResponseInterceptor() {
   @Override
   public void process(HttpResponse response, HttpContext context) throws HttpException, IOException {
      //Method implementation . . . . . . . .
   }
};

Bước 2: Khởi tạo đối tượng ClosableHttpClient

Xây dựng một tùy chỉnh CloseableHttpClient bằng cách thêm bộ chặn đã tạo ở trên vào nó, như được hiển thị bên dưới -

//Creating a CloseableHttpClient object
CloseableHttpClient httpclient =
HttpClients.custom().addInterceptorFirst(responseInterceptor).build();

Sử dụng đối tượng này, bạn có thể thực hiện các yêu cầu như bình thường.

Thí dụ

Ví dụ sau minh họa việc sử dụng các bộ đánh chặn phản ứng. Trong ví dụ này, chúng tôi đã thêm ba tiêu đề: tiêu đề mẫu, tiêu đề trình diễn và tiêu đề thử nghiệm vào phản hồi trong bộ xử lý.

Sau khi thực hiện yêu cầu và nhận được phản hồi, chúng tôi đã in tên của tất cả các tiêu đề của phản hồi bằng cách sử dụng getAllHeaders() phương pháp.

Và trong đầu ra, bạn có thể quan sát tên của ba tiêu đề trong danh sách.

import java.io.IOException;
import org.apache.http.Header;
import org.apache.http.HttpException;
import org.apache.http.HttpResponse;
import org.apache.http.HttpResponseInterceptor;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.protocol.HttpContext;

public class ResponseInterceptorsExample {

   public static void main(String args[]) throws Exception{
      
      //Creating an HttpRequestInterceptor
      HttpResponseInterceptor responseInterceptor = new HttpResponseInterceptor() {
         @Override
         public void process(HttpResponse response, HttpContext context) throws
         HttpException, IOException {
            System.out.println("Adding header sample_header, demo-header, test_header to the response");
            response.setHeader("sample-header", "My first header");
            response.setHeader("demo-header", "My second header");
            response.setHeader("test-header", "My third header"); 
         }
      };

      //Creating a CloseableHttpClient object
      CloseableHttpClient httpclient = HttpClients.custom().addInterceptorFirst(responseInterceptor).build();

      //Creating a request object
      HttpGet httpget1 = new HttpGet("https://www.tutorialspoint.com/");

      //Executing the request
      HttpResponse httpresponse = httpclient.execute(httpget1); 

      //Printing remaining list of headers
      Header[] headers = httpresponse.getAllHeaders();
 
      for (int i = 0; i<headers.length;i++) {
         System.out.println(headers[i].getName());
      }
   }
}

Đầu ra

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

On executing the above program generates the following output.
Adding header sample_header, demo-header, test_header to the response
Accept-Ranges
Access-Control-Allow-Headers
Access-Control-Allow-Origin
Cache-Control
Content-Type
Date
Expires
Last-Modified
Server
Vary
X-Cache
sample-header
demo-header
test-header