わかったみたいです。
ここ:
https://groups.google.com/forum/#!topic/play-framework/XH3ulCys_co
そしてここ:
https://groups.google.com/forum/#!msg/play-framework/M97vBcvvL58/216pTqm22HcJ
説明されている方法がありますwrong
:correct
Doesn't work: curl -d "name=sam" http://localhost:9000/test
Works: curl -d "" http://localhost:9000/test?name=sam
これは、POST パラメータがどのように渡されるかです。(2番目のリンクは理由の説明です):
妥協しなければならないこともあります。Play 1 では、URL パス、クエリ文字列、またはリクエスト本文から抽出された任意のパラメーターからアクション パラメーターをバインドできます。非常に生産的でしたが、フォームのアップロード方法を制御する方法がありませんでした。つまり、ユーザーが大きなファイルをアップロードした場合、それを処理できるようにするには、リクエスト全体をメモリにロードする必要がありました。
Play 2 では、リクエストボディの送信を制御できます。ユーザーに問題がある場合は早期に拒否できます。複数の HTTP チャンクでメモリをいっぱいにすることなく、大きなファイルやストリームを処理できます。何が起こるかを高度に制御できるようになり、サービスのスケーリングに役立ちます。しかし、コインの反対側は、リクエストがルーティングされるとき、Play 2 はリクエストヘッダーのみを使用して決定を下すということです: リクエストボディはまだ利用できないため、から抽出されたパラメーターからアクションパラメーターを直接バインドすることはできません。リクエストボディ。
更新:
興味深いことに、ラップトップで動作するようになった後、gitHub にプッシュして別のマシンにプルすると、動作が異なります。Bad Request is [Invalid XML]と不平を言うようになりましたが、ヘッダーを使用"application/json"
し、コミット後にコード行を変更しませんでした。
更新 2
だから私はそれを次のように修正しました:
dataType
角度側(コメントとコメントもできますheaders
):
var data = $scope.fields
$http({
url: '/forms/FormValidator1/validateForm',
method: "POST",
//dataType: "json",
data: data,
//headers: {'Content-Type': 'application/json'}
}).success(function (data, status, headers, config) {
console.log("good")
}).error(function (data, status, headers, config) {
console.log("something wrong")
});
playFramework 側: ( BodyParserを使用)
def validateForm = Action { request =>
val body: AnyContent = request.body
val jsonBody: Option[JsValue] = body.asJson
// Expecting text body
jsonBody.map { jsValue =>
val name = (jsValue \ "name")
val surname = (jsValue \ "surname")
....
}
ルート (パラメータをまったく定義しないでください!):
POST /forms/FormValidator1/validateForm controllers.FormValidator1.validateForm