'@Produces'에 해당되는 글 2건
JAX-RS @Produces와 @Consumes
Posted at 2009/06/02 10:10// Posted in 나만의 작업
* Content negotiation
Representation을 서버에서 클라이언트로 받을 때 정보를 넘겨줄때 두가지 전략이 있다. (뷰를 판단하는 방법)
1. 하나는 다른 URI를 주는것.
http://www.flyburi.com/user/buri.pdf
http://www. flyburi.com/user/buri.xml
이렇게 다른 파일 확장자를 주는 방법
2. 다른 하나는 같은 URI를 주고 미디어타입의 리스트를 Accept HTTP request header에 주는 방법.
http://www.flyburi.com/user/buri 라고 주고 Accept header에 application/pdf or text/xml이라고 주는 방법 이 방법을 content negotiation이라고 한다.
Accept HTTP 헤더로 뷰를 판단하고 서버 응답은 Content-Type를 통해 뷰를 전달한다.
더 자세한 건 위키피디아 참고
Content negotiation을 JAX-RS에서 쓸려면..
@Consumes, @Produces(요청/응답 미디어 타입 선언) annotation을 사용
리소스 메소드나 리소스 클래스 또는 엔티티 프로바이더에 적용, 생략은 어느 타입(*/*)이나 지원을 의미
Accept 헤더 : 응답 결과 받을 수 있는 가능한 미디어 타입 명시
Content-Type 헤더 : 요청 보낸 entity-body에 대한 미디어 타입 -> 즉, request의 body에 대한 타입
@Produces
@Path("/hi")
@Produces("text/plain")
public class HiResource {
@GET
public String doGetAsPlainText() { ... }
@GET
@Produces("text/html")
public String doGetAsHtml() { ... }
}
클라이언트에서 헤더에 Accept:text/plain을 보냈다면, 서버에서 @Produces("text/plain")을 명시한 Root Resource인 HiResource에서 doGetAsPlainText() 메소드를 실행하고 "text/plain" 타입을 리턴한다.
클라이언트에서 Accept:text/html 를 보냈다면 doGetAsHtml() 메소드를 실행하고 "text/html" 타입을 리턴한다.
@Consumes
@Path("/add")
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
public User add(User input){
try{
User user = User.create(input.getId(), input.getName(), input.getPassword());
userList.add(user);
return user;
}catch(Exception e){
throw new WebApplicationException(e, Response.Status.INTERNAL_SERVER_ERROR);
}
}
클라이언트에서 POST를 수행시에 Data를 전달할때 "JSON" 타입으로 전달하고 싶을때
"Content-Type:application/json" 이렇게 주었을때 @Consumes가 JSON 타입을 받아들일 수 있으므로
add()메소드를 실행할 수 있다.
그리고 @Produces가 JSON, XML 형식으로 명시되어 있으므로 두가지 타입으로 리턴할 수 있다.
* 참고
위의 예제에서 @Produces와 @Consumes의 타입을 명시할때
첫번째에선, @Produces("text/plain") 단순 텍스트로 넣었고, 두번째에선 @Consumes(MediaType.APPLICATION_JSON) 이렇게 넣었는데 둘다 결과는 동일하다.
다만 변수로 접근한 두번째 방법이 변수이기 때문에 오타를 줄일 수 있는 이점이 있다.
고로 절때 @Produces에선 텍스트로 쓰고 @Consumes에선 변수로 써야하는 법은 없다는거~
'나만의 작업' 카테고리의 다른 글
| Jersey의 JSON Support (2) | 2009/06/08 |
|---|---|
| Jersey의 Exception Handling (0) | 2009/06/05 |
| Jersey의 Return Type (0) | 2009/06/04 |
| Jersey의 MessageBodyReader/Writer (0) | 2009/06/03 |
| JAX-RS @Produces와 @Consumes (2) | 2009/06/02 |
| JAX-RS의 구성 (0) | 2009/06/01 |
| What is Jersey? (0) | 2009/06/01 |
| What is JAX-RS? (0) | 2009/05/29 |
| What is REST? (2) | 2009/05/27 |
Tag @Consumes,
@Produces,
accept-header,
content negotiation,
content-type,
JAX-RS,
jersey,
REST,
RESTful
-
2009/06/02 10:42 [Edit/Del] [Reply]
cetaurijax-rs 공부해 보려고 했는데 세미나 또 이렇게 정리해 주니 초쿰 좋은데요..-
2009/06/02 13:59 [Edit/Del]
버리야이거보면 헤매실 거에요...으흐흐흐 +_+
-
JAX-RS의 구성
Posted at 2009/06/01 13:34// Posted in 나만의 작업
1. Root Resource Classes
* 웹 리소스을 구현하기 위해 JAX-RS 어노테이션을 사용하는 자바 클래스
적어도 하나의 메소드에 @Path을 사용한 POJO
Root resource class들은 JAX-RS runtime에 인스턴스화된다.
@Path 어노테이션이 달린 Resource 클래스
@Path("/hi")
public class HiResource {
@GET
@Produces("text/plain")
public String getAsText() {
return "Hi! buri. Show Text.";
}
2. Resource Methods
@GET
@POST
@PUT
@DELETE
@HEAD
* URI Templates
@Path annotation의 값은 상대 경로 URI.
@Path("user list/{id}")
@Path("user%20list/{id})
두개의 path는 동등하다. 어노테이션의 값은 자동으로 인코딩된다
정규 표현식도 가능하다.
* sub resources
리소스 클래스에서 @Path 어노테이션이 달린 메소드는 하위 리소스 메소드나 하위 리소스 로케이터가 된다.
3. Extracting Request Parameters
@FormParam : Form값이 전송된 경우 Form안의 값들을 꺼내온다.
@QueryParam : URI 쿼리 파라미터의 값을 꺼내온다.
@PathParam : URI template에 명시되어 있는 값을 꺼내온다.
@CookieParam : 쿠키에 있는 값을 꺼내온다.
@HeaderParam : 헤더에 있는 값을 꺼내온다.
@Context : Request header나 URI 정도등등의 inject 정보를 사용할 수 있다.
@POST
@Consumes("application/x-www-form-urlencoded")
public void post(@FormParam("name") String name){ .... }
@GET
@Path("/user/{id}")
public void get(@PathParam("id") String id) { .... }
@GET
public String get(@Context UriInfo ui){
MultivaluedMap<String, String> queryParams = ui.getQueryParameters();
MultivaluedMap<String, String> pathParams = ui.getPathParameters();
}
@GET
public String get(@Context HttpHeaders hh){
MultivaluedMap<String, String> headerParams = ui.getRequestHeaders();
Map<String, Cookie> pathParams = ui.getCookies();
}
* Annotation Inheritance
public interface ReadOnlyAtomFeed {
@GET @Produces("application/atom+xml")
Feed getFeed();
}
@Path("feed")
public class ActivityLog implements ReadOnlyAtomFeed {
public Feed getFeed() {...}
}
* 기타 Annotation
@DefaultValue : @Context만 빼고 위의 다른 어노테이션에서 기본값 설정을 할때에 사용
@Encoded : @FormParam, @MatrixParam, @QueryParam, @PathParam 에서 파라미터 값을 자동으로 URI 디코딩하지 않도록 한다.
'나만의 작업' 카테고리의 다른 글
| Jersey의 Exception Handling (0) | 2009/06/05 |
|---|---|
| Jersey의 Return Type (0) | 2009/06/04 |
| Jersey의 MessageBodyReader/Writer (0) | 2009/06/03 |
| JAX-RS @Produces와 @Consumes (2) | 2009/06/02 |
| JAX-RS의 구성 (0) | 2009/06/01 |
| What is Jersey? (0) | 2009/06/01 |
| What is JAX-RS? (0) | 2009/05/29 |
| What is REST? (2) | 2009/05/27 |
| Thinkfree Office Live 한국어 서비스 시작 (2) | 2009/04/01 |
Tag @Context,
@CookieParam,
@DefaultValue,
@DELETE,
@FormParam,
@GET,
@HEAD,
@HeaderParam,
@Path,
@PathParam,
@POST,
@Produces,
@PUT,
@QueryParam,
annotation,
JAX-RS,
jersey,
REST,
RESTful,
Web Service


