IBM®
메인 컨텐츠로 가기
    Korea [국가변경]    이용약관
 
 
   
        제품    서비스 & 솔루션    고객지원 & 다운로드    회원 서비스    
메인 컨텐츠로 가기

한국 developerWorks  >  자바 | SOA와 웹서비스 | 오픈 소스  >

RESTful한 웹 서비스 만들기

REST와 RESTlet 프레임워크에 대한 소개

developerWorks
Go to the previous page15 페이지 중 10 페이지Go to the next page

문서 옵션

샘플 코드


제안 및 의견
피드백

튜토리얼 평가

이 컨텐츠를 개선하기 위한 도움을 주십시오.


RESTful하게 경기를 생성하기

RESTful한 웹 서비스를 통해 경기를 생성하는 것, 이제 몇 단계만 남았을 뿐이다. XML 문서를 받아 파싱하여 하부 데이터베이스에 새로운 Race 인스턴스를 생성한 다음 마지막으로 트랜잭션 결과를 나타내는 응답을 반환하는 것, 이 절에서는 이 단계들에 대해 다룬다.

POST 요청 다루기

REST를 통해 하나의 생성 스타일 행동을 구현하려면 POST 요청을 논리적으로 다룰 필요가 있다. 따라서 RacesResource 클래스에서 두 가지 메서드, 즉 allowPost()post()를 오버라이드해야 한다.

post() 메서드는 여기서 모든 일을 다 한다. post() 메서드는 Representation 인스턴스를 취하는데, 여러분이 POST된 데이터를 얻을 수 있는 곳으로부터 post() 메서드는 인스턴스를 취하게 된다. Listing 23createRace 테스트 케이스는 data라는 이름의 XML 문서와 연관되어 있음을 상기하자. 결과적으로 Restlet 프레임워크의 Form 객체를 통해 들어오는 XML을 나타내는 String을 얻을 수 있고, 그런 후 제공된 RaceConsumer 객체로 전달될 수 있다. 이 객체는 XML 문서를 받아들여 하부 데이터베이스에 대응하여 다루는 데 손색이 없다.

트랜잭션이 동작한다면 성공했다는 응답이 올 것이다. 그렇지 않다면 실패 메시지가 올 것이다.

계속 해서 Listing 24에 보인 대로 allowPost()post()를 오버라이드하자.


Listing 24. POST 메서드 오버라이드
                    
public boolean allowPost() {
 return true;
}

public void post(Representation representation) {}

RaceConsumer 객체를 사용할 것이므로 RacesResource 클래스에 멤버 변수로 추가하고 생성자에서 초기화하는 건 상식이다. Listing 25에 보인 대로 객체를 수정하자.


Listing 25. RaceConsumer 클래스 추가
                    
public class RacesResource extends Resource {
 private RaceReporter reporter;
 private RaceConsumer consumer;

 public RacesResource(Context context, Request request, Response response) {
  super(context, request, response);
  this.getVariants().add(new Variant(MediaType.TEXT_XML));
  this.reporter = new RaceReporter();
  this.consumer = new RaceConsumer();
 }
}

다음으로 post() 메서드가 Listing 26처럼 생겼는지 확인해 보자.


Listing 26. post() 구현
                    
public void post(Representation representation) {
 Form form = new Form(representation);
 String raceXML = form.getFirstValue("data");
 Representation rep = null;
 try {
  long id = this.consumer.createRace(raceXML);
  getResponse().setStatus(Status.SUCCESS_CREATED);
  rep = new StringRepresentation(raceXML, MediaType.TEXT_XML);
  rep.setIdentifier(getRequest().getResourceRef().getIdentifier() + id);
 } catch (Throwable thr) {
  getResponse().setStatus(Status.SERVER_ERROR_INTERNAL);
  rep = new StringRepresentation("there was an error creating the race",
    MediaType.TEXT_PLAIN);
 }
 getResponse().setEntity(rep);
}

보다시피 post 메서드에는 많은 일이 벌어지고 있다. 그렇지만 면밀히 살펴본다면 보이는 것처럼 머리 터질 일만은 아니다. 무엇보다도 인입되는 XML은 Form 객체를 통해 얻어진다. 그러고 나서 XML(String 형태)은 consumer 인스턴스의 createRace() 메서드로 전달된다. 뭔가 작업이 이뤄졌다면(즉 경기가 지속되었다면) 응답이 만들어진다. 이 응답에는 성공했는지에 대한 상태, 인입 XML을 다시 써먹기 위해 혹은 좀 다듬어 내놓을 수도 있고 결과에 대한 URI(즉 race/43 여기서 43은 새롭게 생성된 경기의 id) 등이 담겨 있을 것이다.

제대로 안 되었다면 필수적으로 동일한 과정이 따라오겠지만 실패 상태와 실패 메시지가 반환될 것이다. 아무것도 생성된 게 없으니 URI도 반환되지 않을 것이다.

게속해서 createRace 테스트를 돌려보자. RESTful한 웹 애플리케이션을 재배치한다면 잘 돌아갈 것이다!




위로



Go to the previous page15 페이지 중 10 페이지Go to the next page
    IBM 소개 개인정보 보호정책 문의