Red Hat Training
A Red Hat training course is available for Red Hat Fuse
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());