Apache HttpClient - 拦截器

  • 简述

    拦截器是那些有助于阻止或更改请求或响应的拦截器。协议拦截器通常作用于特定的标头或一组相关的标头。 HttpClient 库提供对拦截器的支持。
  • 请求拦截器

    HttpRequestInterceptor 接口代表请求拦截器。此接口包含一个称为进程的方法,您需要在其中编写代码块来拦截请求。
    在客户端,此方法在将请求发送到服务器之前验证/处理请求,而在服务器端,此方法在评估请求正文之前执行。

    创建请求拦截器

    您可以按照以下步骤创建请求拦截器。
    第 1 步 - 创建一个HttpRequestInterceptor对象
    通过实现其抽象方法流程创建HttpRequestInterceptor接口的对象。
    
    HttpRequestInterceptor requestInterceptor = new HttpRequestInterceptor() {
    
    
    @Override
     public void process(HttpRequest request, HttpContext context) throws
    HttpException, IOException {
       //Method implementation . . . . .
    };
    
    第 2 步 - 实例化 CloseableHttpClient 对象
    通过添加上面创建的拦截器来构建一个自定义的 CloseableHttpClient 对象,如下所示 -
    
    //Creating a CloseableHttpClient object
    CloseableHttpClient httpclient =
    HttpClients.custom().addInterceptorFirst(requestInterceptor).build();
    
    使用这个对象,你可以像往常一样执行请求。

    示例

    下面的例子演示了请求拦截器的用法。 在本例中,我们创建了一个 HTTP GET 请求对象,并为其添加了三个标头:sample-header、demoheader 和 test-header。
    在拦截器的processor()方法中,我们正在验证发送请求的headers; 如果这些标头中的任何一个是 sample-header,我们会尝试将其删除并显示该特定请求的标头列表。
    
    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.cainiaoya.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());
       }
    }
    

    输出

    在执行上述程序时,会生成以下输出 -
    
    Contains header sample-header, removing it..
    demo-header
    test-header
    HTTP/1.1 200 OK
    
  • 响应拦截器

    HttpResponseInterceptor 接口表示响应拦截器。 该接口包含一个称为 process() 的方法。 在这种方法中,您需要编写代码块来拦截响应。
    在服务器端,此方法在将响应发送到客户端之前验证/处理响应,在客户端,此方法在评估响应正文之前执行。

    创建响应拦截器

    您可以按照以下步骤创建响应拦截器 -
    第一步 - 创建一个HttpResponseInterceptor对象
    通过实现其抽象方法进程来创建HttpResponseInterceptor接口的对象。
    
    HttpResponseInterceptor responseInterceptor = new HttpResponseInterceptor() {
       @Override
       public void process(HttpResponse response, HttpContext context) throws HttpException, IOException {
          //Method implementation . . . . . . . .
       }
    };
    

    第二步:实例化 CloseableHttpClient 对象

    通过添加上面创建的拦截器来构建一个自定义的 CloseableHttpClient 对象,如 如下图-
    
    //Creating a CloseableHttpClient object
    CloseableHttpClient httpclient =
    HttpClients.custom().addInterceptorFirst(responseInterceptor).build();
    
    使用这个对象,你可以像往常一样执行请求。
  • Example

    下面的例子演示了响应拦截器的使用。 在本例中,我们在处理器的响应中添加了三个标头:sample-header、demo-header 和 test-header。
    在执行请求并获得响应后,我们使用 getAllHeaders() 方法打印出所有响应头的名称。
    并且在输出中,可以观察到列表中三个标题的名称。
    
    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.cainiaoya.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());
          }
       }
    }
    
  • 输出

    在执行时,上面的程序会产生以下结果 -
    
    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