우선 RESTFul로 구현된 WebService를 Flex에서 호출하기 위해서는 클라이언트에서 method방식이 GET, POST, DELETE, PUT을 지원을 해야합니다. 근데, 제가 RESTful WebService를 만들었는데요. 만들어놓고, 자체 GlassFish에서 제공하는 RESTful WebService Test로는 무쟈게 잘 돌아갔습니다.
근데, Flex에서 제공하는 HTTPService를 이용해서 method는 DELETE로 놓은다음에 http요청을 해봤습니다. 이게 왠걸......POST로 요청이 되는 듯해서 데이터를 가져오고 있습니다-_-; 지워야하는데!
그래서 검색을 해보니.......
http://verveguy.blogspot.com/2008/07/truth-about-flex-httpservice.html
저의 짧은 영어실력으로 보니.......
그래서! 검색해본 결과 REST요청을 위한 라이브러리를 누가 만들었더군요. 대단합니다 ^^ 어차피 HTTP요청도 해당 포트로 뭐 데이터를 주고 받는 것이다 보니, 이것을 소켓으로 구현을 했더군요.
http://lab.arc90.com/2008/03/restservice.php
기존 HTTPService랑 틀린 것이...얘는 소켓을 통해서 쏘기 때문에 포트를 지정해줘야합니다. 그리고 arc90에서 만든 ResultEvent랑 FaultEvent를 사용해야합니다.
서버측 코드를 보면
[code]
@DELETE
public Response delete() {
PersistenceService persistenceSvc = PersistenceService.getInstance();
try {
Wsboard entity = getEntity();
if (entity.getPwd().equals(pwd))
{
persistenceSvc.beginTx();
persistenceSvc.removeEntity(entity);
persistenceSvc.commitTx();
return Response.ok("success").build();
}
} finally {
persistenceSvc.close();
}
return Response.ok("fail").build();
}
[/code]
그냥 단순히 비밀번호가 같으면 지워서 응답을 success로 주고, 틀리면 fail로 줍니다.
이제 플렉스에서 봅시다.
[code]
<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml"
layout="absolute"
creationComplete="init()" xmlns:rest="com.arc90.rpc.rest.*">
<mx:Script>
<![CDATA[
import com.arc90.rpc.events.FaultEvent;
import com.arc90.rpc.events.ResultEvent;
import mx.controls.Alert;
private function init():void
{
service.send();
}
private function result(event:ResultEvent):void
{
Alert.show(event.result.toString());
}
private function fault(event:FaultEvent):void
{
Alert.show(event.fault.toString());
}
]]>
</mx:Script>
<rest:RESTService id="service"
port="9080" url="http://localhost/BoardWS/resources/wsboards/22/1"
result="result(event)" fault="fault(event)" method="DELETE">
</rest:RESTService>
</mx:WindowedApplication>
[/code]
포트를 port라고 해서 따로 지정해줍니다.
저 웹서비스가 {idx}/{pwd} 형식의 url을 요청합니다. DB에는 22번의 idx를 가지고 pwd가 1인 데이터가 있습니다. 저렇게 요청하면 지워집니다.
ps. 정말 적절하지 못한 웹서비스군-_-;
근데, Flex에서 제공하는 HTTPService를 이용해서 method는 DELETE로 놓은다음에 http요청을 해봤습니다. 이게 왠걸......POST로 요청이 되는 듯해서 데이터를 가져오고 있습니다-_-; 지워야하는데!
그래서 검색을 해보니.......
http://verveguy.blogspot.com/2008/07/truth-about-flex-httpservice.html
저의 짧은 영어실력으로 보니.......
4/ All HTTP PUT and HTTP DELETE requests are turned into POST requests. This appears to be a browser limitation that the Flash player is stuck with.라고 되어있군요. PUT과 DELETE는 POST로 요청이 된다고 하는 것 같습니다. 플래쉬플레이어가 브라우저 제한에 뭐 걸린 것으로 보인다고 말하는데요. 해석이 잘 안되네요-_-;
그래서! 검색해본 결과 REST요청을 위한 라이브러리를 누가 만들었더군요. 대단합니다 ^^ 어차피 HTTP요청도 해당 포트로 뭐 데이터를 주고 받는 것이다 보니, 이것을 소켓으로 구현을 했더군요.
http://lab.arc90.com/2008/03/restservice.php
기존 HTTPService랑 틀린 것이...얘는 소켓을 통해서 쏘기 때문에 포트를 지정해줘야합니다. 그리고 arc90에서 만든 ResultEvent랑 FaultEvent를 사용해야합니다.
서버측 코드를 보면
[code]
@DELETE
public Response delete() {
PersistenceService persistenceSvc = PersistenceService.getInstance();
try {
Wsboard entity = getEntity();
if (entity.getPwd().equals(pwd))
{
persistenceSvc.beginTx();
persistenceSvc.removeEntity(entity);
persistenceSvc.commitTx();
return Response.ok("success").build();
}
} finally {
persistenceSvc.close();
}
return Response.ok("fail").build();
}
[/code]
그냥 단순히 비밀번호가 같으면 지워서 응답을 success로 주고, 틀리면 fail로 줍니다.
이제 플렉스에서 봅시다.
[code]
<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml"
layout="absolute"
creationComplete="init()" xmlns:rest="com.arc90.rpc.rest.*">
<mx:Script>
<![CDATA[
import com.arc90.rpc.events.FaultEvent;
import com.arc90.rpc.events.ResultEvent;
import mx.controls.Alert;
private function init():void
{
service.send();
}
private function result(event:ResultEvent):void
{
Alert.show(event.result.toString());
}
private function fault(event:FaultEvent):void
{
Alert.show(event.fault.toString());
}
]]>
</mx:Script>
<rest:RESTService id="service"
port="9080" url="http://localhost/BoardWS/resources/wsboards/22/1"
result="result(event)" fault="fault(event)" method="DELETE">
</rest:RESTService>
</mx:WindowedApplication>
[/code]
포트를 port라고 해서 따로 지정해줍니다.
저 웹서비스가 {idx}/{pwd} 형식의 url을 요청합니다. DB에는 22번의 idx를 가지고 pwd가 1인 데이터가 있습니다. 저렇게 요청하면 지워집니다.
ps. 정말 적절하지 못한 웹서비스군-_-;