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 インターフェイス

ClientResponseFilterfilter メソッドは、型 javax.ws.rs.client.ClientRequestContext の引数 (「ClientRequestContext インターフェイス」を参照) と型 javax.ws.rs.client.ClientResponseContext の引数 (送信レスポンスメッセージとその関連データにアクセスするために使用できる) の 2 つの引数を受け取ります。

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.WebTarget オブジェクトに直接登録できます。そのため、クライアント要求フィルターはオプションで異なるスコープに適用できるので、このフィルターの影響を受けるのは、特定の URI パスのみです。

たとえば、以下のコードは、client オブジェクトを使用して実行されたすべての呼び出しに適用されるように 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());