web-dev-qa-db-ja.com

Play Frameworkでリクエストパラメーターを取得しますか?

私はプレイフレームワークを学び、/manager/userなどのリクエストを次のようにマッピングできることを理解しています。

  GET      /manage/:user    Controllers.Application.some(user:String)

/play/video?video_id=1sh1のようなリクエストをどのようにマッピングしますか?

24
user2054833

少なくとも2つの可能性があります。それらをapproach1およびapproach2

  1. 最初のアプローチでは、デフォルト値を使用してroutesパラメーターを宣言できます。 0は、その上に何らかの条件を構築するのが最も簡単になるため、良い候補です。また、typesafeであり、それ自体を事前検証します。 推奨最初にこのソリューションを使用します。
  2. 2番目のアプローチは、リクエストからparamsをStringとして直接読み取るため、整数に解析し、必要に応じてさらに検証する必要があります。

routes

GET     /approach1      controllers.Application.approach1(video_id: Int ?=0)
GET     /approach2      controllers.Application.approach2

行動:

public static Result approach1(int video_id) {
    if (video_id == 0) return badRequest("Wrong video ID");
    return ok("1: Display video no. " + video_id);
}

public static Result approach2() {
    int video_id = 0;

    if (form().bindFromRequest().get("video_id") != null) {
        try {
            video_id = Integer.parseInt(form().bindFromRequest().get("video_id"));
        } catch (Exception e) {
            Logger.error("int not parsed...");
        }
    }

    if (video_id == 0) return badRequest("Wrong video ID");
    return ok("2: Display video no. " + video_id);
}

PS: LOL文字列識別子を使用したいことに気付きました...とにかく両方のアプローチは似ています:)

23
biesior

私は単にそれを使ってやります:

GET /play/video      Controllers.Application.video(video_id:String)

そして、コントローラーにはもちろん次のようなものがあります。

public static Result video(String video_id) {

     return ok("We got video id of: " + video_id);

}

あるいは、playはデフォルトでパラメータをStringとして扱うように見えるため、video_id:Stringを追加する必要はありません。したがって、(少なくとも最新のplayでは)次のようにも機能します。

GET /play/video      Controllers.Application.video(video_id)

アドレスバーにlocalhost:9000/play/video?video_id=1sh1と入力すると、印刷されるビューが表示されます。

次のビデオIDを取得しました:1sh1

パラメータを追加するにはは次のように簡単です。

GET     /play/video                      controllers.Application.video(video_id:String, site:String, page:Integer)

コントローラ:

public static Result video(String video_id, String site, Integer page) {

    return ok("We got video id of: " + video_id + " site: " + site + " page: " + page);

}

アドレスバーにlocalhost:9000/play/video?video_id=1as1&site=www.google.com&page=3と入力すると、印刷されるビューが表示されます。

次のビデオIDを取得しました:1as1サイト:www.google.comページ:3

どういたしまして^^。

19
Mauno Vähä

URLをコントローラーで機能するようにマップすることを意図している場合、意味がわかりませんが、biesiorの答えは完璧ですが、getメソッドでフォームを送信することを意味する場合

@helper.form(action = routes.YourController.page1()) {

 }

そして、フォームのパラメータを次のようなurl書き換え形式のurlに設定します。

page1/foo/bar instead of page1?param1=foo&param2=bar 

それはhttpの仕様なので、それを行う方法はありません

コントローラーの最初の関数でパラメーターを取得し、次のように別のビューにリダイレクトすることで、この制限を回避することがよくあります

public static Result page1(){
   String param1 = Form.form().bindFromRequest().get("param1");
   String param2= Form.form().bindFromRequest().get("param2");

   return ( redirect( routes.YourController.page2(param1,param2)));
}      

その後、ページ2に何でもあります

public static Result page2(String param1,String param2){

        ...............
 }

そしてこれをroutesファイルに入れます:

GET  page2/:param1/:param2        controllers.YourControllers.page2(param1 : String, param2 : String )

私はそれが助けになることを願っていますが、それがベストプラクティスであるかどうかはわかりません

4
Siavosh

わかりましたので、私はちょうどドキュメントを読んで、私が理解していることはあなたがする必要があるということです

GET /play/video         Controllers.Application.video()

そして、コントローラーでHttpRequestオブジェクトのgetQueryStringを呼び出します

http://www.playframework.com/documentation/api/2.1.0/Java/index.html

2
smk