48.3. 애플리케이션 응답 미세 조정

48.3.1. 응답 빌드의 기본 사항

48.3.1.1. 개요

RESTful 서비스는 리소스 메서드가 일반 Java 구문을 반환할 때 허용되는 것보다 소비자에 대해 반환된 응답을 보다 정확하게 제어해야 합니다. JAX-RS Response 클래스를 사용하면 리소스 메서드에서 소비자에게 전송된 반환 상태를 제어하고 HTTP 메시지 헤더와 쿠키를 응답으로 지정할 수 있습니다.

response 개체는 소비자에게 반환되는 엔터티를 나타내는 개체를 래핑합니다. Response objects wrap the object representing the entity that is returned to the consumer. 응답 오브젝트는 Response Builder 클래스를 팩토로 사용하여 인스턴스화됩니다.

ResponseBuilder 클래스에는 응답의 메타데이터를 조작하는 데 사용되는 많은 방법이 있습니다. 예를 들어 ResonseBuilder 클래스에는 HTTP 헤더 및 캐시 제어 지시문을 설정하는 메서드가 포함됩니다.

48.3.1.2. 응답 빌더와 응답 빌더 간 관계

Response 클래스에는 보호된 생성자가 있으므로 직접 인스턴스화할 수 없습니다. 이는 Response 클래스로 묶은 ResponseBuilder 클래스를 사용하여 생성됩니다. ResponseBuilder 클래스는 생성된 응답으로 캡슐화될 모든 정보에 대한 소유자입니다. ResponseBuilder 클래스에는 메시지에서 HTTP 헤더 속성을 설정하는 방법도 있습니다.

Response 클래스는 적절한 응답 코드를 쉽게 설정하고 엔터티를 래핑하는 몇 가지 메서드를 제공합니다. 각 공통 응답 상태 코드에 대한 방법이 있습니다. 엔터티 본문 또는 필수 메타데이터를 포함하는 상태에 해당하는 메서드에는 관련 응답 빌더로 정보를 직접 설정할 수 있는 버전이 포함됩니다.

ResponseBuilder 클래스의 build() 메서드는 메서드가 호출될 때 응답 빌더에 저장된 정보를 포함하는 response 오브젝트를 반환합니다. 응답 오브젝트가 반환되면 응답 빌더가 정리 상태로 반환됩니다.

48.3.1.3. 응답 빌더 가져오기

응답 빌더를 가져오는 방법에는 두 가지가 있습니다.

  • Response 클래스를 사용하여 응답 빌더 가져오기 에서와 같이 Response 클래스의 정적 메서드 사용

    Response 클래스를 사용하여 응답 빌더 가져오기

    import javax.ws.rs.core.Response;
    
    Response r = Response.ok().build();

    이러한 방식으로 응답 빌더를 가져올 때 인스턴스에 액세스할 수 없는 경우 여러 단계에서 조작할 수 있습니다. 모든 작업을 단일 메서드 호출로 입력해야 합니다.

  • Apache CXF 특정 ResponseBuilderImpl 클래스 사용. 이 클래스를 사용하면 응답 빌더에서 직접 작업할 수 있습니다. 그러나 모든 응답 빌더 정보를 수동으로 설정해야 합니다.

    예 48.1. “ResponseBuilderImpl 클래스를 사용하여 응답 빌더 가져오기” ResponseBuilderImpl 클래스를 사용하여 Response 클래스를 사용하여 응답 빌더 가져오기 을 다시 작성할 수 있는 방법을 보여줍니다.

    예 48.1. ResponseBuilderImpl 클래스를 사용하여 응답 빌더 가져오기

    import javax.ws.rs.core.Response;
    import org.apache.cxf.jaxrs.impl.ResponseBuilderImpl;
    
    ResponseBuilderImpl builder = new ResponseBuilderImpl();
    builder.status(200);
    Response r = builder.build();
    참고

    Response 클래스의 메서드에서 반환된 ResponseBuilder Response BuilderImpl 오브젝트에 간단히 할당할 수도 있습니다.

48.3.1.4. 더 알아보기

Response 클래스에 대한 자세한 내용은 Response 클래스의 Javadoc 을 참조하십시오.

ResponseBuilder 클래스에 대한 자세한 내용은 ResponseBuilder 클래스의 Javadoc 을 참조하십시오.

Apache CXF ResponseBuilderIml 클래스에 대한 자세한 내용은 ResponseBuilderImpl Javadoc 을 참조하십시오.

48.3.2. 일반적인 사용 사례에 대한 응답 생성

48.3.2.1. 개요

Response 클래스는 RESTful 서비스에 필요한 더 일반적인 응답을 처리하기 위한 바로 가기 메서드를 제공합니다. 이러한 메서드는 제공된 값 또는 기본값을 사용하여 적절한 헤더 설정을 처리합니다. 또한 적절한 경우 엔티티 본문을 채우기를 처리합니다.

48.3.2.2. 성공적인 요청에 대한 응답 생성

요청이 성공적으로 처리되면 요청이 충족되었음을 인정하기 위해 응답을 보내야 합니다. 이 응답은 엔터티를 포함할 수 있습니다.

응답을 성공적으로 완료할 때 가장 일반적인 응답은 OK 입니다. OK 응답에는 일반적으로 요청에 해당하는 엔터티가 포함됩니다. Response 클래스에는 응답 상태를 200 으로 설정하고 첨부된 응답 빌더에 제공된 엔터티를 추가하는 오버로드된 ok() 메서드가 있습니다. ok() 메서드의 다섯 가지 버전이 있습니다. 가장 일반적으로 사용되는 변형은 다음과 같습니다.

  • response .ok()- 200 상태 및 빈 엔티티 본문으로 응답을 만듭니다.
  • response .ok(java.lang.Object 엔티티) - 응답200 인 응답을 만들고, 제공된 오브젝트를 응답 엔티티 본문에 저장하고, 오브젝트를 검사하여 엔터티 유형을 결정합니다.

200 응답을 사용하여 응답 생성 에서는 OK 상태로 응답을 생성하는 예를 보여줍니다.

200 응답을 사용하여 응답 생성

import javax.ws.rs.core.Response;
import demo.jaxrs.server.Customer;
...

Customer customer = new Customer("Jane", 12);

return Response.ok(customer).build();

요청자가 엔티티를 요구하지 않는 경우, 200 OK 상태 대신 204 No Content status를 보내는 것이 더 적절할 수 있습니다. Response.noContent() 메서드는 적절한 응답 오브젝트를 생성합니다.

204 상태로 응답 생성204 상태로 응답을 생성하는 예를 보여줍니다.

204 상태로 응답 생성

import javax.ws.rs.core.Response;

return Response.noContent().build();

48.3.2.3. 리디렉션에 대한 응답 생성

Response 클래스는 리디렉션 응답 상태 3개를 처리하는 메서드를 제공합니다.

303 다른 보기

303 기타 보기 상태는 요청된 리소스가 요청을 처리하도록 소비자를 새 리소스로 영구적으로 리디렉션해야 하는 경우에 유용합니다.

Response 클래스는 Other () 메서드를 참조 하며 303 상태의 응답을 생성하고 새 리소스 URI를 메시지의 위치 필드에 배치합니다. see Other() 메서드는 새 URI를 java.net.URI 오브젝트로 지정하는 단일 매개 변수를 사용합니다.

304 수정되지 않음

304 Not Modified 상태는 요청 특성에 따라 다양한 용도로 사용될 수 있습니다. 이전 GET 요청 이후 요청된 리소스가 변경되지 않았음을 나타내는 데 사용할 수 있습니다. 또한 리소스를 수정하라는 요청을 통해 리소스가 변경되지 않았음을 나타낼 수도 있습니다.

Response 클래스 notModified() 메서드는 304 상태로 응답을 생성하고 HTTP 메시지에 수정된 날짜 속성을 설정합니다. notModified() 메서드의 세 가지 버전이 있습니다.

  • notModified
  • notModifiedjavax.ws.rs.core.Entitytag
  • notModifiedjava.lang.Stringtag
307 임시 리디렉션

307 임시 리디렉션 상태는 요청된 리소스가 소비자를 새 리소스로 전달해야 하지만 소비자가 향후 요청을 처리하기 위해 이 리소스를 계속 사용하고자 하는 경우 유용합니다.

응답 클래스 temporaryRedirect() 메서드는 307 상태로 응답을 생성하고 새 리소스 URI를 메시지의 위치 필드에 배치합니다. temporaryRedirect() 메서드는 새 URI를 java.net.URI 오브젝트로 지정하는 단일 매개 변수를 사용합니다.

304 상태로 응답 생성304 상태로 응답을 생성하는 예를 보여줍니다.

304 상태로 응답 생성

import javax.ws.rs.core.Response;

return Response.notModified().build();

48.3.2.4. 신호 오류에 대한 응답 생성

Response 클래스는 두 가지 기본 처리 오류에 대한 응답을 생성하는 메서드를 제공합니다.

  • serverError- 500 Internal Server Error 상태로 응답을 만듭니다.
  • notAcceptablejava.util.List<javax.ws.rs.core.Variant>변형- 허용되는 리소스 유형 목록이 포함된 406 Not Acceptable 상태 및 엔터티 본문으로 응답을 만듭니다.

500 상태의 응답 생성500 상태의 응답을 생성하는 예를 보여줍니다.

500 상태의 응답 생성

import javax.ws.rs.core.Response;

return Response.serverError().build();

48.3.3. 더 많은 고급 응답 처리

48.3.3.1. 개요

Response 클래스 메소드는 일반적인 사례에 대한 응답을 생성하기 위한 짧은 컷을 제공합니다. 캐시 제어 지시문 지정, 사용자 지정 HTTP 헤더 추가 또는 Response 클래스에서 처리되지 않은 상태를 전송하는 등의 복잡한 경우를 처리해야 하는 경우 build() 메서드를 사용하여 응답 오브젝트를 생성하기 전에 ResponseBuilder 클래스 메서드를 사용하여 응답을 채워야 합니다.

“응답 빌더 가져오기” 에서 설명한 대로 Apache CXF ResponseBuilderImpl 클래스를 사용하여 직접 조작할 수 있는 응답 빌더 인스턴스를 생성할 수 있습니다.

48.3.3.2. 사용자 정의 헤더 추가

ResponseBuilder 클래스의 header() 메서드를 사용하여 사용자 정의 헤더가 응답에 추가됩니다. header() 메서드는 두 개의 매개변수를 사용합니다.

  • name- 헤더 이름을 지정하는 문자열입니다.
  • value- 헤더에 저장된 데이터를 포함하는 Java 오브젝트

header() 메서드를 반복적으로 호출하여 메시지에 여러 개의 헤더를 설정할 수 있습니다.

응답에 헤더 추가 응답에 헤더를 추가하는 코드를 표시합니다.

응답에 헤더 추가

import javax.ws.rs.core.Response;
import org.apache.cxf.jaxrs.impl.ResponseBuilderImpl;

ResponseBuilderImpl builder = new ResponseBuilderImpl();
builder.header("username", "joe");
Response r = builder.build();

48.3.3.3. 쿠키 추가

ResponseBuilder 클래스의 cookie() 메서드를 사용하여 사용자 정의 헤더가 응답에 추가됩니다. cookie() 방법은 하나 이상의 쿠키를 사용합니다. 각 쿠키는 javax.ws.rs.core.NewCookie 개체에 저장됩니다. NewCookie 클래스의 contructors의 가장 쉬운 방법은 두 가지 매개 변수를 사용합니다.

  • name- 쿠키 이름을 지정하는 문자열입니다.
  • value- 쿠키 값을 지정하는 문자열입니다.

cookie() 메서드를 반복적으로 호출하여 여러 쿠키를 설정할 수 있습니다.

응답에 쿠키 추가 응답에 쿠키를 추가하는 코드를 보여줍니다.

응답에 쿠키 추가

import javax.ws.rs.core.Response;
import javax.ws.rs.core.NewCookie;

NewCookie cookie = new NewCookie("username", "joe");

Response r = Response.ok().cookie(cookie).build();

주의

null 매개 변수 목록을 사용하여 cookie() 메서드를 호출하면 이미 응답과 연결된 모든 쿠키가 지워집니다.

48.3.3.4. 응답 상태 설정

Response 클래스의 도우미 메서드에서 지원하는 상태 중 하나를 제외한 상태를 반환하려는 경우 Response Builder 클래스의 status() 메서드를 사용하여 응답의 상태 코드를 설정할 수 있습니다. status() 메서드에는 두 가지 변형이 있습니다. 응답 코드를 지정하는 int 를 가져옵니다.Gets an int that specifies the response code. 다른 하나는 Response.Status 오브젝트를 사용하여 응답 코드를 지정합니다.

Response.Status 클래스는 Response 클래스에 포함된 열거형입니다. 대부분의 정의된 HTTP 응답 코드에 대한 항목이 있습니다.

응답에 헤더 추가 응답 상태를 404 Not Found 로 설정하기 위한 코드를 보여줍니다.

응답에 헤더 추가

import javax.ws.rs.core.Response;
import org.apache.cxf.jaxrs.impl.ResponseBuilderImpl;

ResponseBuilderImpl builder = new ResponseBuilderImpl();
builder.status(404);
Response r = builder.build();

48.3.3.5. 캐시 제어 지시문 설정

ResponseBuilder 클래스의 cacheControl() 메서드를 사용하면 응답에서 캐시 제어 헤더를 설정할 수 있습니다. cacheControl() 메서드는 응답에 대한 캐시 제어 지시문을 지정하는 javax.ws.rs.CacheControl 개체를 사용합니다.

CacheControl 클래스에는 HTTP 사양에서 지원하는 모든 캐시 제어 지시문에 해당하는 메서드가 있습니다. 지시문은 setter 메서드에서 부울 값을 사용하는 간단한 on 또는 off 값입니다. 지시문에 max-age 지시문과 같은 숫자 값이 필요한 경우 setter는 int 값을 사용합니다.

응답에 헤더 추가 no-store 캐시 제어 지시문을 설정하기 위한 코드를 표시합니다.

응답에 헤더 추가

import javax.ws.rs.core.Response;
import javax.ws.rs.core.CacheControl;
import org.apache.cxf.jaxrs.impl.ResponseBuilderImpl;

CacheControl cache = new CacheControl();
cache.setNoCache(true);

ResponseBuilderImpl builder = new ResponseBuilderImpl();
builder.cacheControl(cache);
Response r = builder.build();