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