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 对象上注册客户端响应过滤器,或者在 对象上注册客户端响应过滤器。实际上,这意味着客户端请求过滤器可以选择性地应用到不同的范围,因此只有特定 URI 路径会受到过滤器的影响。
javax. ws.rs.client.WebTarget
例如,以下代码演示了如何注册 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());