61.5. 클라이언트 응답 필터

61.5.1. 개요

이 섹션에서는 클라이언트 측에서 들어오는 응답 메시지를 가로채는 데 사용되는 클라이언트 응답 필터 를 구현하고 등록하는 방법을 설명합니다. 클라이언트 응답 필터는 클라이언트 측의 모든 종류의 일반 응답 처리에 사용할 수 있습니다.

61.5.2. 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 확장 포인트에 대한 필터를 생성하여 서버에서 수신한 후 응답 메시지를 필터링할 수 있습니다.

61.5.3. ClientResponseContext 인터페이스

ClientResponseFilter필터 방법은 javax.ws.rs.client.ClientRequestContext 유형의 인수와 javax.ws.rs.client.ClientResponseContext 형식의 인수와 발신 응답 메시지 및 관련 메타데이터에 액세스하는 데 사용할 수 있는 두 가지 인수를 수신합니다. “ClientRequestContext 인터페이스”

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

61.5.4. 샘플 구현

ClientResponse 확장 포인트(즉, 서버에서 응답 메시지를 수신한 후 필터가 실행되는 클라이언트 응답 필터)를 구현하려면 ClientResponseFilter 인터페이스를 구현하는 클래스를 정의합니다.

예를 들어 다음 코드는 priority가 20인 ClientResponse 확장 지점에 설치된 간단한 클라이언트 응답 필터의 예를 보여줍니다.

// 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");
  }
}

61.5.5. 클라이언트 응답 필터 등록

JAX-RS 2.0 클라이언트 API를 사용하여 javax.ws.rs.client.Client 오브젝트 또는 javax.ws.client. WebTarget 오브젝트에 클라이언트 응답 필터를 직접 등록할 수 있습니다. 효과적으로는 클라이언트 요청 필터를 선택적으로 다른 범위에 적용할 수 있으므로 필터의 특정 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());