backend

JAX-RS @Produces와 @Consumes

버리야 2009. 6. 2. 10:10
반응형
* 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에선 변수로 써야하는 법은 없다는거~  




반응형

'backend' 카테고리의 다른 글

Jersey의 JSON Support  (2) 2009.06.08
Jersey의 Exception Handling  (0) 2009.06.05
Jersey의 Return Type  (0) 2009.06.04
Jersey의 MessageBodyReader/Writer  (1) 2009.06.03
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