5

私の中でroutes

POST        /forms/FormValidator1/validateForm                       controllers.FormValidator1.validateForm(jsonForm:String)

そのルート用に定義されたコントローラーメソッドがあります。

def validateForm(jsonForm:String) = Action { ...

次に、chrome POSTMAN プラグインで POST リクエストを送信しようとします (上の写真を参照)。

私が使う:

url: http://localhost:9000/forms/FormValidator1/validateForm
headers: Content Type: application/json
json data: {name: "me", surname: "my"}

したがって、この POST リクエストを送信すると、言及されたルート/URL によってコントローラーのメソッドに到達できません。なんで?

アップデート:

興味深いことに、ラップトップで動作するようになった後 (以下の回答を参照)、gitHub にプッシュして別のマシンにプルすると、動作が異なります。Bad Request is [Invalid XML]と不平を言うようになりまし"application/json"たが、ヘッダーを使用し、コミット後にコード行を変更しませんでした。バグなのかな。

ここに画像の説明を入力

4

1 に答える 1

3

わかったみたいです。

ここ: https://groups.google.com/forum/#!topic/play-framework/XH3ulCys_co

そしてここ: https://groups.google.com/forum/#!msg/play-framework/M97vBcvvL58/216pTqm22HcJ

説明されている方法がありますwrongcorrect

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
于 2013-11-13T02:32:48.777 に答える