6

私はこの質問で使用されている概念や技術の多くにかなり慣れていないので、コミュニティの初心者のために少し理解して助けていただければ幸いです。私は Play Framework バージョン 2.1.3 を使用しています。リモート データベースに挿入できるように、データを RESTful Web サービスに POST する必要があります。成功または失敗を示す XML 応答が返されます。

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

私の最初の質問は、Web サービスにアクセスするための推奨される設計パターンはありますか? 次に、Play MVC フレームワークを考えると、そのような設計パターンを実装し、データをパッケージ化し (アプリケーションがユーザーからのデータを既にキャプチャして検証していると仮定して)、それを送信し、応答を処理してユーザーに戻すにはどうすればよいでしょうか?

かなり長い質問であることは承知していますが、この背後にある私の意図は、初心者が限られた経験で簡単に参加し、ここで見つけたものを読んで理解し、複製して実用的なソリューションを作成できるような知識ベースを作成することです. ウェブをかなり広範囲に検索したところ、バラバラなスニペットがいくつか見つかりましたが、これらのテクノロジーや最新のチュートリアルを含む具体的なものは何も見つかりませんでした. お時間をいただきありがとうございます。

4

1 に答える 1

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);

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

Play はFutures と Promisesを使用してブロックを回避します。コントローラーのasyncメソッドは を受け取り、Promise<Result>後で結果 (将来の値) を返します。上記のgetおよびメソッドによって、使いやすい promise が提供されます。postそれらの実装を気にする必要はありませんResponse。リクエストが完了したら、提供することを約束していることを知っておく必要があります。

ここで問題に注意してWS.url("...").get()ください。ここでは、メソッドを使用して応答を結果に変換する別の promise を自分で実装する必要があります。Java には (まだ) クロージャがなく、すべてをクラスにラップする必要があるため、Play のドキュメントに従うと、これは少し混乱するように見えます。ただし、メソッド呼び出し内で匿名クラスを使用する必要はありません。よりクリーンなコードを好む場合は、次のようにすることもできます。Promise<Response>asyncPromise<Result>map

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実際には、引数として a のみを受け取り、 を返すある種のコールバック メソッドの面倒な定義のようなもの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 がコメントで指摘したように、Play 2.2.x で Web サービスを呼び出す場合、呼び出しをラップしませんasync。単純に以下を返しますPromise<Result>:

public static Promise<Result> index() {
    return request.get().map(resultFromResponse);
}
于 2013-09-02T18:26:14.500 に答える