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.ClientRequestContext
(请参阅 “ClientRequestContext interface”一节);以及类型为 javax.ws.rs.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
对象或 javax.ws.rs.client.client.client.client.client.client .client.client.Client 对象上直接注册客户端
响应过滤器。实际上,这意味着客户端请求过滤器可以选择性地应用到不同的范围,以便只有某些 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());