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; }
// 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 接口”一节),以及类型为 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); }
// 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"); } }
// 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 对象或
对象上直接注册客户端响应过滤器。实际上,这意味着客户端请求过滤器可以选择性地应用到不同的范围,以便只有特定的 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());
// 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());