2013-09-01 10 views
6

この質問で使用されている概念やテクノロジの多くはかなり新しいので、コミュニティからの初心者のための理解と助けに感謝します。私はPlay Frameworkバージョン2.1.3を使用しており、リモートデータベースに挿入できるようにRESTfulなWebサービスにPOSTデータを送る必要があります。成功または失敗を示すXML応答が返されます。方法:初心者向けのPlay Framework 2.1でRESTfulなWebサービスにアクセスする

Play Frameworkのドキュメントが非常に不足しているため、初心者にはあまり役に立ちませんので、ベストプラクティスを念頭に置いてこのタスクを達成する方法がわかりません。私はこの問題のJavaソリューションを探していますが、現在はScala言語を学ぶ時間がありません。 Webサービスに関する私の経験はかなり限られています。通常、アプリケーション内でDAOデザインパターンを実装するか、必要に応じて多数の利用可能なORMライブラリを使用し、JDBCを使用してデータベースに直接接続します。これはオプションではありません。

私の最初の質問は、ウェブサービスにアクセスするための推奨されるデザインパターンがあるかどうかです。次に、Play MVCフレームワークを考慮して、そのようなデザインパターンを実装し、データをパッケージ化し(アプリケーションがすでにユーザーからデータを取得して検証したと仮定して)、それを送信してユーザーに返します。

かなり長い質問ですが、私の意図は、初心者のための知識ベースを作成して、限られた経験を持ち、読んで理解し、複製して解決策を作り出せるようにすることです。 Webを広範に検索した結果、いくつかの抜け落ちた抜粋は見つかりましたが、これらの技術や最新のチュートリアルは含まれていませんでした。あなたの時間をありがとう。

+0

この投稿はありませんまっすぐに複製が、私は信じて、非常に似ていますhttp://stackoverflow.com/questions/4379485/restful-on-play-framework - と組み合わせます遊び! ToDo Listの例とそれはあなたに確かな出発点を与えるはずです。 – pfairbairn

+0

回答はありがとうございました。質問は2010年に尋ねられたので、私は、プレイ2は、2012年にリリースされただけなので、フレームワークバージョン1を再生することを意味していると想定しています。しかし、私は間違っている可能性があり、投稿をダブルチェックします。私はここでもベストプラクティスに重点を置いています。 – Hegemon

+0

公平な点ですが、Java Play 2.1のToDoリスト、http://www.playframework.com/documentation/2.1.x/JavaTodoListを参照すると、HTTPリクエストに対するPOST、GET、PUTを使用したルーティングに関する情報は、たとえそれが幾分日付が付いていても、SOの投稿をまだ役に立つように見えるようにする。 – pfairbairn

答えて

11

リクエストの作成は簡単です。最初にURLを指定します。コンテンツタイプ、クエリパラメータ、タイムアウトなどをリクエストに追加するには、さまざまな方法があります。次に、要求タイプを選択し、必要に応じて送信するコンテンツを追加します。例:

WSRequestHolder request = WS.url("http://example.com"); 
request.setQueryParameter("page", "1"); 
Promise<Response> promise = request.get(); 
Promise<Response> promise = WS.url("http://example.com").post(content); 

複雑な部分は、それを送信し、リクエストの応答を使用することです。 Webサービスの応答に基づいて、ユーザーにResultを返すコントローラがあると仮定します。結果は、通常レンダリングされたテンプレートか、単なるステータスコードかもしれません。

再生は、Futures and Promisesを使用してブロックしないようにします。コントローラのasyncメソッドはPromise<Result>で、ある時点で結果(将来の値)を返します。上記のgetpostの方法で、使いやすい約束が提供されます。その実装について気にする必要はありませんが、要求が完了したらResponseを提供することを約束するだけです。

お知らせここで問題:WS.url("...").get()で要求を作成する場合asyncPromise<Result>を取るPromise<Response>にもかかわらず、それはあなたを与えるだろう。ここでは、別の約束を自分で実装しなければなりません。これは、mapメソッドを使用して結果への応答を変換します。 Playのドキュメントに従えば、Javaはクロージャ(まだ)を持っておらず、すべてがクラスにラップされなければならないので、これはちょっと混乱します。メソッド呼び出しの中で匿名クラスを使う必要はありません。あなたはより多くのクリーンなコードを好む場合、あなたはまた、このようにそれを行うことができます。

return async( 
    request     
    .get()     // returns a `Promise<Response>` 
    .map(resultFromResponse) // map takes a `Function<Response, Result>` and 
          // returns the `Promise<Result>` we need 
); 

を対象resultFromResponseは、以下のように見えることがあります。実際には、引数としてのみResponseをとり、Resultを返すコールバックメソッドの厄介な定義と同じです。

Function<Response, List<T>> resultFromResponse = 
    new Function<Response /* 1st parameter type */, Result /* return type */>() { 
     @Override 
     public Result apply(Response response) { 
      // example: read some json from the response 
      String message = response.asJson().get("message"); 
      Result result = ok(message); 
      return result; 
     } 
    }; 

@itsjeydはcalling webservices in Play 2.2.xあなたが任意のよりasyncで呼び出しをラップしていない場合、コメントで指摘したように。あなたは、単に返すPromise<Result>

public static Promise<Result> index() { 
    return request.get().map(resultFromResponse); 
} 
+1

深い回答ありがとうございます。このほとんどはPlayサイトで利用可能ですが、混乱の原因を取り除くことができました。私はそれを試してみましょう。 – Hegemon

+1

+1すばらしい答えです。あなたがこれを "知識の基盤"にしたいと思って以来、私は演劇の時にそれを追加したいと思います! 2.2.x、 'async'を介して' Result'sを返すことは非推奨です。他のWebサービスを呼び出すアクションは、代わりに 'Promise 'を返すべきです。これは、上記の 'return'文を' return request.get()。map(resultFromResponse); 'に変更することで実現できます。 – itsjeyd

関連する問題