これは、バックグラウンド SpringMVC コントローラーが isform パラメーターを受け取り、その値を単に入力するメソッドです:
@RequestMapping(method = RequestMethod.POST) @ResponseBody public Map<String, Object> save( @RequestParam(value = "isform", required = false) String isform) { System.out.println("isform value: " + isform); return null; }
フロントページはフォームを送信するための投稿リクエストを送信します
バックグラウンドで値が取得されていないことが判明しました
後で考えた最初の解決策は、json パラメーターを受け取るために requestbody をコントローラー メソッドのパラメーターに追加することでした。
@RequestMapping(method = RequestMethod.POST) @ResponseBody public Map<String, Object> save( @RequestParam(value = "isform", required = false) @RequestBody String isform) { System.out.println("isform value: " + isform); return null; }
しかし、isform の値の結果は依然として null です、
そこで、以前のプロジェクトで投稿リクエストを受信するためのパラメーターを比較したところ、興味深い現象が見つかりました。
以下は Angular のデフォルトのリクエストヘッダーです:
$httpProvider.defaults.headers.post: (POST リクエストのヘッダーのデフォルト)
Content-Type: application/json
$httpProvider.defaults.headers.put(PUT リクエストのヘッダーのデフォルト)
Content-Type: application/json
Angular の post と put は両方とも application/json、
jquery のポストリクエストの「Content-Type」はデフォルトで「application/x-www-form-urlencoded」になっているため、angular のデフォルトの Content-Type を変更しました。
app.config(function($httpProvider) { $httpProvider.defaults.headers.put['Content-Type'] = 'application/x-www-form-urlencoded'; $httpProvider.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded'; });
次のリクエストボディはこうなりますが、この後もisformの値が取得できません、
長い間チェックした結果、ある外国人のブログでその理由を発見しました:
デフォルトでは、jQuery は Content-Type: x-www-form-urlencoded とおなじみの foo=bar&baz=moe シリアル化を使用してデータを送信しますが、AngularJS は Content-Type: application/json と { を使用してデータを送信します。 "foo": "bar", "baz": "moe" } JSON シリアル化
私自身による翻訳:
デフォルトでは、jQuery は Content-Type: x-www-form-urlencoded と「foo=bar&baz=moe」のようなシーケンスを使用してデータを送信しますが、AngularJS は Content-Type: application/json と { " を使用してデータを送信します。 foo": "bar", "baz": "moe" } このような JSON シーケンス。
したがって、Content-Type を x-www-form-urlencodedand に設定した後も、シーケンスの形式を変換する必要があります。
以下は私が外国人と練習した後に自分で試した最終的な解決策です:
app.config(function($httpProvider) { $httpProvider.defaults.headers.put['Content-Type'] = 'application/x-www-form-urlencoded'; $httpProvider.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded'; // Override $http service's default transformRequest $httpProvider.defaults.transformRequest = [function(data) { /** * The workhorse; converts an object to x-www-form-urlencoded serialization. * @param {Object} obj * @return {String} */ var param = function(obj) { var query = ''; var name, value, fullSubName, subName, subValue, innerObj, i; for (name in obj) { value = obj[name]; if (value instanceof Array) { for (i = 0; i < value.length; ++i) { subValue = value[i]; fullSubName = name + '[' + i + ']'; innerObj = {}; innerObj[fullSubName] = subValue; query += param(innerObj) + '&'; } } else if (value instanceof Object) { for (subName in value) { subValue = value[subName]; fullSubName = name + '[' + subName + ']'; innerObj = {}; innerObj[fullSubName] = subValue; query += param(innerObj) + '&'; } } else if (value !== undefined && value !== null) { query += encodeURIComponent(name) + '=' + encodeURIComponent(value) + '&'; } } return query.length ? query.substr(0, query.length - 1) : query; }; return angular.isObject(data) && String(data) !== '[object File]' ? param(data) : data; }]; });
上記のコードを angular モジュールに追加して、その効果を見てみましょう:
投稿リクエストのスタイルが jquery の投稿リクエストのスタイルと一致していることがわかりました。これは本当ですか? ! !
バックグラウンドでパラメータ受信ステータスを確認します。
isform がパラメータを正常に受信できるようになり、これで完了です。
上記は、angular のポストリクエストのバックグラウンド受信パラメーターが null になる場合の解決策です。皆さんの学習に役立つことを願っています。