49.4. 요청 및 응답 구문 분석

49.4.1. 개요

HTTP 호출을 수행하는 중요한 측면은 클라이언트가 발신 요청 메시지와 들어오는 응답을 구문 분석할 수 있어야 한다는 것입니다. JAX-RS 2.0에서 키 개념은 Entity 클래스이며, 미디어 유형으로 태그된 원시 메시지를 나타냅니다. 원시 메시지를 구문 분석하려면 미디어 유형을 특정 Java 유형으로 변환하거나 미디어 유형을 변환하는 기능이 있는 여러 엔터티 공급자 를 등록할 수 있습니다.

즉, JAX-RS 2.0의 컨텍스트에서 Entity 는 원시 메시지의 표현이며 엔터티 공급자는 원시 메시지를 구문 분석하는 기능을 제공하는 플러그인입니다( media type 기반).

49.4.2. 엔터티

Entity 는 메타데이터(미디어 유형, 언어 및 인코딩)에 의해 보강된 메시지 본문입니다. Entity 인스턴스는 메시지를 원시 형식으로 유지하며 특정 미디어 유형과 연결됩니다. Entity 개체의 콘텐츠를 Java 개체로 변환하려면 지정된 미디어 유형을 필수 Java 유형에 매핑할 수 있는 엔터티 공급자 가 필요합니다.

49.4.3. 변형

javax.ws.rs.core.Variant 오브젝트는 다음과 같이 엔터티 와 연결된 메타데이터를 캡슐화합니다.

  • 미디어 유형
  • 언어,
  • 인코딩.

효과적으로는 엔터티 를 HTTP 메시지 콘텐츠로 구성하여 Variant 메타데이터로 보강할 수 있습니다.

49.4.4. 엔터티 공급자

엔터티 공급자는 미디어 유형과 Java 유형 간에 매핑 기능을 제공하는 클래스입니다. 엔터티 공급자를 특정 미디어 유형(또는 여러 미디어 유형)의 메시지를 구문 분석하는 기능을 제공하는 클래스로 생각할 수 있습니다. 엔티티 제공자의 두 가지 종류가 있습니다:

MessageBodyReader
미디어 유형에서 Java 유형으로 매핑할 수 있는 기능을 제공합니다.
MessageBodyWriter
Java 유형에서 미디어 유형으로 매핑할 수 있는 기능을 제공합니다.

49.4.5. 표준 엔터티 공급자

다음 Java 및 미디어 유형 조합에 대한 엔터티 공급자는 표준으로 제공됩니다.

byte[]
모든 미디어 유형( */* ).
java.lang.String
모든 미디어 유형( */* ).
java.io.InputStream
모든 미디어 유형( */* ).
java.io.Reader
모든 미디어 유형( */* ).
java.io.File
모든 미디어 유형( */* ).
javax.activation.DataSource
모든 미디어 유형( */* ).
javax.xml.transform.Source
XML 유형(text/xml,application/xml, 그리고 application/xml 형식)은 application/*+xml형식으로 되어 있습니다.
javax.xml.bind.JAXBElement 및 애플리케이션에서 제공하는 JAXB 클래스
XML 유형(text/xml,application/xml, 그리고 application/xml 형식)은 application/*+xml형식으로 되어 있습니다.
MultivaluedMap<String,String>
폼 콘텐츠(application/x-www-form-urlencoded).
StreamingOutput
모든 미디어 유형(*/*), MessageBodyWriter 만 해당됩니다.
java.lang.Boolean, java.lang.Character, java.lang.Number
text/plain 에만 해당한다. boxing/unboxing 변환을 통해 지원되는 해당하는 기본 형식입니다.

49.4.6. 응답 오브젝트

기본 반환 유형은 형식화되지 않은 응답을 나타내는 javax.ws.rs.core.Response 유형입니다. Response 오브젝트는 메시지 본문, HTTP 상태, HTTP 헤더, 미디어 유형 등을 포함하여 완전한 HTTP 응답에 대한 액세스를 제공합니다.

49.4.7. 응답 상태 액세스

getStatus 메서드(HTTP 상태 코드 반환)를 통해 응답 상태에 액세스할 수 있습니다.

int status = resp.getStatus();

또는 설명 문자열을 제공하는 getStatusInfo 메서드를 사용합니다.

String statusReason = resp.getStatusInfo().getReasonPhrase();

49.4.8. 반환된 헤더에 액세스

다음 방법 중 하나를 사용하여 HTTP 헤더에 액세스할 수 있습니다.

MultivaluedMap<String,Object>
getHeaders()

MultivaluedMap<String,String>
getStringHeaders()

String
getHeaderString(String name)

예를 들어 응답날짜 헤더가 있음을 알고 있는 경우 다음과 같이 액세스할 수 있습니다.

String dateAsString = resp.getHeaderString("Date");

49.4.9. 반환된 쿠키 액세스

다음과 같이 getCookies 방법을 사용하여 응답에 설정된 새 쿠키에 액세스할 수 있습니다.

import javax.ws.rs.core.NewCookie;
...
java.util.Map<String,NewCookie> cookieMap = resp.getCookies();
java.util.Collection<NewCookie> cookieCollection = cookieMap.values();

49.4.10. 반환된 메시지 콘텐츠에 액세스

Response 개체에서 readEntity 메서드 중 하나를 호출하여 반환된 메시지 콘텐츠에 액세스할 수 있습니다. readEntity 메서드는 사용 가능한 엔터티 공급자를 자동으로 호출하여 메시지를 요청된 유형( ReadEntity의 첫 번째 인수로 지정)으로 변환합니다. 예를 들어, 메시지 콘텐츠에 String 유형으로 액세스하려면 다음을 수행합니다.

String messageBody = resp.readEntity(String.class);

49.4.11. 컬렉션 반환 값

Java 일반 유형(예: List 또는 Collection 유형)으로 반환된 메시지에 액세스해야 하는 경우 javax.ws.rs.core.GenericType<T> 구조를 사용하여 요청 메시지 유형 을 지정할 수 있습니다. 예를 들면 다음과 같습니다.

import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Client;
import javax.ws.rs.core.GenericType;
import java.util.List;
...
GenericType<List<String>> stringListType = new GenericType<List<String>>() {};

Client client = ClientBuilder.newClient();
List<String> bookNames = client.target("http://example.org/bookstore/booknames")
                     .request("text/plain")
                     .get(stringListType);