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 클래스에 대한 자세한 내용은
클래스의 Javadoc 을 참조하십시오.
ResponseBuilder
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
-
notModified
javax.ws.rs.core.Entity
tag
-
notModified
java.lang.String
tag
-
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
상태로 응답을 만듭니다. -
notAcceptable
java.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
Builderstatus()
메서드를 사용하여 응답의 상태 코드를 설정할 수 있습니다. status()
메서드에는 두 가지 변형이 있습니다. 응답 코드를 지정하는 int
를 가져옵니다.Gets an int that specifies the response code. 다른 하나는 Response.Status
오브젝트를 사용하여 응답 코드를 지정합니다.
클래스는 Response 클래스에 포함된 열거형입니다. 대부분의 정의된 HTTP 응답 코드에 대한 항목이 있습니다.
Response
.Status
응답에 헤더 추가 응답 상태를 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();