61.5. 客户端响应过滤器

概述

本节介绍如何实施和注册客户端 响应过滤器,该过滤器 用于截获客户端上的传入响应消息。客户端响应过滤器可用于客户端上任意一种通用响应处理。

ClientResponseFilter 接口

javax.ws.rs.client.ClientResponseFilter 接口定义如下:

// Java
package javax.ws.rs.client;
...
import java.io.IOException;

public interface ClientResponseFilter {
    void filter(ClientRequestContext requestContext, ClientResponseContext responseContext)
            throws IOException;
}

通过实施 ClientResponseFilter,您可以为客户端一侧的 ClientResponse 扩展点创建一个过滤器,在从服务器接收响应消息后过滤它。

ClientResponseContext 接口

ClientResponseFilter过滤 方法接收两个参数:类型为 javax.ws.rs.client.client.ClientRequestContext (请参阅 “ClientRequestContext 接口”一节)和类型为 javax.ws.rs.client.client.ClientResponseContext 的参数,它可用于访问传出响应消息及其相关的元数据。

ClientResponseContext 接口定义如下:

// Java
...
package javax.ws.rs.client;

import java.io.InputStream;
import java.net.URI;
import java.util.Date;
import java.util.Locale;
import java.util.Map;
import java.util.Set;

import javax.ws.rs.core.EntityTag;
import javax.ws.rs.core.Link;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.core.NewCookie;
import javax.ws.rs.core.Response;

public interface ClientResponseContext {

    public int getStatus();

    public void setStatus(int code);

    public Response.StatusType getStatusInfo();

    public void setStatusInfo(Response.StatusType statusInfo);

    public MultivaluedMap<String, String> getHeaders();

    public String getHeaderString(String name);

    public Set<String> getAllowedMethods();

    public Date getDate();

    public Locale getLanguage();

    public int getLength();

    public MediaType getMediaType();

    public Map<String, NewCookie> getCookies();

    public EntityTag getEntityTag();

    public Date getLastModified();

    public URI getLocation();

    public Set<Link> getLinks();

    boolean hasLink(String relation);

    public Link getLink(String relation);

    public Link.Builder getLinkBuilder(String relation);

    public boolean hasEntity();

    public InputStream getEntityStream();

    public void setEntityStream(InputStream input);
}

实施示例

要为 ClientResponse 扩展名点实施客户端响应过滤器(即,在收到响应消息后执行过滤器),请定义一个实施 ClientResponseFilter 接口的类。

例如,以下代码显示了一个在 ClientResponse 扩展点中安装的简单客户端响应过滤器,优先级为 20:

// Java
package org.jboss.fuse.example;

import javax.ws.rs.client.ClientRequestContext;
import javax.ws.rs.client.ClientResponseContext;
import javax.ws.rs.client.ClientResponseFilter;
import javax.annotation.Priority;

@Priority(value = 20)
public class SampleClientResponseFilter implements ClientResponseFilter {

  public SampleClientResponseFilter() {
    System.out.println("SampleClientResponseFilter starting up");
  }

  @Override
  public void filter(
      ClientRequestContext requestContext,
      ClientResponseContext responseContext
  )
  {
    // Add an extra header on the response
    responseContext.getHeaders().putSingle("MyCustomHeader", "my custom data");
  }
}

注册客户端响应过滤器

使用 JAX-RS 2.0 客户端 API,您可以直接在 javax.ws.rs.client.client.Client 对象上注册客户端响应过滤器,或者在 javax. ws.rs.client.WebTarget 对象上注册客户端响应过滤器。实际上,这意味着客户端请求过滤器可以选择性地应用到不同的范围,因此只有特定 URI 路径会受到过滤器的影响。

例如,以下代码演示了如何注册 SampleClientResponseFilter 过滤器,使其适用于使用 client 对象进行的所有调用:

// Java
...
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Invocation;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.Response;
...
Client client = ClientBuilder.newClient();
client.register(new SampleClientResponseFilter());