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());