URLMappingで以下のように振分けが出来ます。
"/rest/$id?"(controller:"rest"){
action = [GET:"show", PUT:"update", DELETE:"delete", POST:"save"]
}
これで /rest に来たアクセスはメソッドによりアクションへ振分けされます。
GET(普通にブラウザで開いたり)した場合は show アクションへ、POST(フォーム送信とか)なら save アクションへ飛ばされます。
詳しくはIBMの記事を参照下さい。
ではGrailsでRESTfulなサービスを使用するには、というとデフォではそのような機能はありません。(多分)
ここで前に使ったHTTPBuilderを使おうと思ったのですが、こいつがGrailsと組み合わせてしまうと思うように動かないメソッドがあったりします・・・
http.request(GET,TEXT) { req -> } とか・・・ responseが正常に取得出来ません :(
HTTPBuilderは中でApache HttpClientを使ってるだけなんで、こいつを直接使う事にしました。
def client = new HttpClient()
def getMethod = new GetMethod("http://localhost:8080/restProject/rest/1")
getMethod.setRequestHeader("Accept", "text/json")
client.executeMethod(getMethod)
def result=getMethod.getResponseBodyAsString().toString()
これでGETを実行し、結果をStringで受け取れます。
それぞれ PostMethod、PutMethod、DeleteMethodが用意されているのでそれらに置き換えれば他のメソッドを実行出来ます。
RESTってHTTPプロトコルの標準な機能なのでクライアントに特別なライブラリ等を追加する必要がない反面、WSDLのようにメソッドの仕様や型の制御などが作り手次第になってしまうのがちょっと難点な気がします。
でもWSDLと違って、認証等はacegi pluginいれてbasic認証使えば比較的セキュアかつ統合された作りが簡単に出来るのは良いですね!
0 件のコメント:
コメントを投稿