2013-11-26 14 views
10

私は、入力パラメータをPOST変数として送信するログインルートを持っています。私はこのような私のルートを定義していますPlay FrameworkでPOSTルートパラメータを使用する

POST /v1/accounts/login   controllers.v1.Accounts.login(username: String, password: String) 

を、私のコントローラは、このようなものです:私はそれだけでGETパラメータのために働くとのchrome Advance REST Client使用して、このルートをテストする場合

object Accounts extends Controller { 
    def login(username: String, password: String) = Action { 
    Ok("Foo " + username) 
    } 
} 

私のようにそれを送信しない場合application/x-www-form-urlencoded POSTフォームデータ。

Play Framework documentationには実際にPOSTパラメータは記述されていませんが、動作しないとは言いません。

Formを作成してリクエストをバインドするとうまくいくかもしれませんが、それは不必要に複雑なようです。

routesファイルを使用してPOSTパラメータをバインドする方法はありませんか?

+0

: 'アクションメソッドの場合いくつかのパラメータを定義します。これらのパラメータ値はすべて、リクエストURIで検索されます。URIパス自体から抽出されるか、クエリ文字列 'から抽出されるため、実際には動作しませんPOSTパラメータ。 – Mattias

答えて

18

URL内のパラメータを解決する= GET経由でパラメータを送信する。

これは、POSTリクエストを送信しようとしていることを意味します。GET params ...意味はどこですか?

ジェームズローパーがあることを説明:ルーティング時

を、プレイはまだリクエストボディを消費していない、ので、送信されたフォームを解析されていません。リクエストボディがパースされ、ストリーミングされ、別の場所に送られるかどうかを決定するあなたのアクションであるため、Playはこれをルーティング時に実行した場合、アクションで何ができるかを制限します。

セキュリティの観点から、クライアントのパスにあるすべてのマシンのログに資格情報を残すことは間違いありません。 base form documentationで説明したように代わり

あなたは一般的な形式の取扱方法でそれを行う必要があります。

ルート:

POST /v1/accounts/login  controllers.v1.Accounts.login 

アクション:私はちょうどこれに気づい

val userForm = Form(
    tuple(
    "username" -> text, 
    "password" -> text 
) 
) 

def login = Action { implicit request => 
    val (username, password) = userForm.bindFromRequest.get 
    Ok("Hello " + username + ", you're trying to login with: " + password) 
} 
+0

ありがとうございます、ログファイルはGETパラメータが受け入れられなかった理由の1つでした。 これは私のようなものですが、自動パラメータバインディングはGETパラメータに対してのみ機能します。 – Mattias

+0

より高度なフォームieを使用すれば、それほど劇的ではないでしょう。あらかじめ定義された制約であなたはセキュリティを増強し、ユーザー名に長さが必要かどうか、電子メールかどうかなどを確認できます。 – biesior

+2

ルーティング時に、Playは要求本体をまだ消費していないため、送信されたフォームは解析されません。リクエストボディがパースされ、ストリーミングされ、別の場所に送られるかどうかを決定するあなたのアクションであるため、Playはこれをルーティング時に実行した場合、アクションで何ができるかを制限します。 –

関連する問題