49장. JAX-RS 2.0 클라이언트 API
초록
JAX-RS 2.0은 REST 호출 또는 HTTP 클라이언트 호출에 사용할 수 있는 완전한 기능을 갖춘 클라이언트 API를 정의합니다. 여기에는 fluent API(요청 구축 간소화), 메시지 구문 분석을 위한 프레임워크(엔터 제공자라고도 함) 및 클라이언트 측에서 비동기 호출 지원이 포함됩니다.
49.1. JAX-RS 2.0 클라이언트 API 소개
49.1.1. 개요
JAX-RS 2.0은 JAX-RS 클라이언트의 fluent API를 정의하므로 HTTP 요청 단계별로 빌드한 다음 적절한 HTTP 동사(GET, POST, PUT 또는 DELETE)를 사용하여 요청을 호출할 수 있습니다.
jaxrs:client
요소를 사용하여 Blueprint XML 또는 Spring XML에서 JAX-RS 클라이언트를 정의할 수도 있습니다. 이 방법에 대한 자세한 내용은 18.2절. “JAX-RS 클라이언트 엔드 포인트 구성” 을 참조하십시오.
49.1.2. 종속 항목
애플리케이션에서 JAX-RS 2.0 클라이언트 API를 사용하려면 프로젝트의 pom.xml
파일에 다음 Maven 종속성을 추가해야 합니다.
<dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-rs-client</artifactId> <version>3.3.6.fuse-7_11_1-00015-redhat-00002</version> </dependency>
비동기 호출 기능을 사용하려는 경우( 49.6절. “클라이언트의 비동기 처리”참조) 다음 Maven 종속성도 필요합니다.
<dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-transports-http-hc</artifactId> <version>3.3.6.fuse-7_11_1-00015-redhat-00002</version> </dependency>
49.1.3. 클라이언트 API 패키지
JAX-RS 2.0 클라이언트 인터페이스와 클래스는 다음 Java 패키지에 있습니다.
javax.ws.rs.client
JAX-RS 2.0 Java 클라이언트를 개발하는 경우 일반적으로 코어 패키지에서 클래스에 액세스해야 합니다.
javax.ws.rs.core
49.1.4. 간단한 클라이언트 요청의 예
다음 코드 조각은 간단한 예를 보여줍니다. JAX-RS 2.0 클라이언트 API는 http://example.org/bookstore
JAX-RS 서비스에서 호출하고 GET HTTP 메서드로 호출하는 데 사용됩니다.
// Java import javax.ws.rs.client.ClientBuilder; import javax.ws.rs.client.Client; import javax.ws.rs.core.Response; ... Client client = ClientBuilder.newClient(); Response res = client.target("http://example.org/bookstore/books/123") .request("application/xml").get();
49.1.5. fluent API
JAX-RS 2.0 클라이언트 API는 fluent API (도메인별 언어라고도 함)로 설계되었습니다. fluent API에서는 Java 메서드가 간단한 언어의 명령처럼 보이는 방식으로 Java 메서드 체인이 단일 문으로 호출됩니다. JAX-RS 2.0에서 fluent API는 REST 요청을 빌드하고 호출하는 데 사용됩니다.
49.1.6. REST 호출을 수행하는 단계
JAX-RS 2.0 클라이언트 API를 사용하여 다음과 같이 일련의 단계에서 클라이언트 호출을 빌드하고 호출합니다.
- 클라이언트를 부트스트랩합니다.
- 대상을 구성합니다.
- 호출을 빌드하고 만듭니다.Build and make the invocation.
- 응답을 구문 분석합니다.
49.1.7. 클라이언트를 부트스트랩
첫 번째 단계는 javax.ws.rs.client.Client
오브젝트를 생성하여 클라이언트를 부트스트랩하는 것입니다. 이 Client
인스턴스는 비교적 많은 가중치 오브젝트로, JAX-RS 클라이언트를 지원하는 데 필요한 기술 스택을 나타냅니다( 인터셉터 및 추가 CXF 기능 포함). 이상적으로 새 오브젝트를 생성하는 대신 클라이언트 개체를 다시 사용할 수 있어야 합니다.
새 Client
오브젝트를 생성하려면 다음과 같이 ClientBuilder
클래스에서 static 메서드를 호출합니다.
// Java import javax.ws.rs.client.ClientBuilder; import javax.ws.rs.client.Client; ... Client client = ClientBuilder.newClient(); ...
49.1.8. 대상 구성
대상을 구성하면 REST 호출에 사용할 URI를 효과적으로 정의합니다. 다음 예제에서는 path(String)
메서드를 사용하여 기본 URI, 기본
, 경로 세그먼트를 기본 URI에 추가하는 방법을 보여줍니다.
// Java import javax.ws.rs.client.WebTarget; ... WebTarget base = client.target("http://example.org/bookstore/"); WebTarget books = base.path("books").path("{id}"); ...
49.1.9. 빌드 및 호출
이 단계는 실제로 두 단계로 구성됩니다. 먼저 HTTP 요청(헤더, 수락된 미디어 유형 포함)을 빌드하고, 두 번째는 관련 HTTP 메서드를 호출합니다(필요한 경우 요청 메시지 본문을 제공하는 옵션).
예를 들어 application/xml
미디어 유형을 수락하는 요청을 생성하고 호출하려면 다음을 수행합니다.
// Java import javax.ws.rs.core.Response; ... Response resp = books.resolveTemplate("id", "123").request("application/xml").get();
49.1.10. 응답 구문 분석
마지막으로 이전 단계에서 얻은 Respose 를
구문 분석해야 합니다. 일반적으로 응답은 다른 HTTP 메타데이터 및 HTTP 메시지 본문(있는 경우)과 함께 HTTP 헤더를 캡슐화하는 javax.ws.rs.core.Response
오브젝트 형태로 반환됩니다.
String
형식으로 반환된 HTTP 메시지에 액세스하려면 다음과 같이 String.class
인수를 사용하여 readEntity
메서드를 호출하여 쉽게 수행할 수 있습니다.
// Java ... String msg = resp.readEntity(String.class);
항상
를 String
.classreadEntity
에 인수로 지정하여 응답의 메시지 본문에 String으로 액세스할 수 있습니다. 메시지 본문의 보다 일반적인 변환 또는 변환을 위해 엔터티 공급자를 제공하여 변환을 수행할 수 있습니다.For more general transformations or conversions of the message body, you can provide an entity provider to perform the conversion. 자세한 내용은 49.4절. “요청 및 응답 구문 분석” 에서 참조하십시오.