Spring MVC は HTTP PUT メソッドのリクエストパラメータを持つことができますか、それとも post を使用する必要がありますか? RESTful にするにはどちらを使用すればよいですか? 質問する

Spring MVC は HTTP PUT メソッドのリクエストパラメータを持つことができますか、それとも post を使用する必要がありますか? RESTful にするにはどちらを使用すればよいですか? 質問する

HTTP PUT であるべきだと思うコントローラー アクションがありますが、コントローラー アクションで @RequestParam を使用しようとすると、Spring からエラーが発生します。HTTP PUT メソッドではリクエスト パラメーターが許可されていないため、Spring がそれを拒否しているのでしょうか。

@RequestMapping(value = "/{helpDocumentId}/vote", method = RequestMethod.PUT)
public void voteHelpfulness(@PathVariable long helpDocumentId, @RequestParam boolean isHelpful) {
    helpManager.voteOnHelpDocument(helpDocumentId, isHelpful);
}

実行すると、次のエラーがスローされます。

org.springframework.web.bind.MissingServletRequestParameterException: Required boolean parameter 'isHelpful' is not present

もちろん、isHelpfulパラメータは存在します。上記のコードを HTTP POST で完璧に動作させることができるので、これが問題ではないことはわかっています。

     $.ajax({
            url: "/help/" + helpDocumentId + "/vote.json",
            type: "PUT",
            data: {
                isHelpful: isHelpful
            },
            success: function(response) {
                // ....
            }
     });

PUT は正しい http メソッドですか? このアクションは を変更しますhelpDocumentが、作成はしません。

ベストアンサー1

以来スプリング3.1、HTTPPutFormコンテンツフィルターデータの取り扱いに使用できますapplication/x-www-form-urlencoded:

ServletRequest.getParameter*()HTTP PUT リクエスト中にメソッド ファミリを通じてフォーム エンコードされたデータを利用できるようにするフィルター。

サーブレット仕様では、フォーム データは HTTP POST では使用可能ですが、HTTP PUT リクエストでは使用可能ではありません。このフィルターは、コンテンツ タイプが である HTTP PUT リクエストをインターセプトし'application/x-www-form-urlencoded'、リクエストの本文からフォームでエンコードされたコンテンツを読み取り、ServletRequest をラップして、HTTP POST リクエストの場合と同様にフォーム データをリクエスト パラメーターとして使用できるようにします。

@RequestBodyJSONなどの他の受信データについては、JQuery、Spring MVC @RequestBody、JSON - 連携させる415 サポートされていないメディア タイプが発生しないようにします。

おすすめ記事