Ini ialah kaedah untuk pengawal SpringMVC latar belakang saya menerima parameter isform dan hanya taip nilainya:
@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; }
Halaman hadapan menghantar permintaan pos untuk menyerahkan borang
Didapati bahawa nilai tidak diperoleh di latar belakang
Penyelesaian pertama yang saya fikirkan kemudian ialah menambah badan permintaan pada parameter kaedah pengawal untuk menerima parameter json
@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; }
Kemudian saya membandingkan parameter untuk menerima permintaan pos dalam projek sebelumnya, dan mendapati fenomena menarik,
$httpProvider.defaults.headers.post: (header lalai untuk permintaan POST)
Jenis Kandungan: application/json
$httpProvider.defaults.headers.put(pengepala lalai untuk permintaan PUT)
Jenis Kandungan: application/json
Siaran dan put Angular adalah kedua-dua aplikasi/json,"Content-Type" permintaan siaran jquery menjadi lalai kepada "application/x-www-form-urlencoded", jadi saya menukar Content-Type lalai bagi sudut,
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'; });
Setelah lama menyemak,
menemui sebabnya di blog warga asing:
Secara lalai, jQuery menghantar data menggunakan Content-Type: x-www-form-urlencoded dan siri foo=bar&baz=moe yang biasa, bagaimanapun, menghantar data menggunakan Content-Type: application/json dan {. "foo": "bar", "baz": "moe" } Siri JSON
Diterjemah oleh saya sendiri:
Jadi selepas menetapkan Content-Type kepada x-www-form-urlencodedand, anda masih perlu menukar format jujukan,
Berikut adalah penyelesaian akhir yang saya telah uji sendiri selepas berlatih dengan orang asing:
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; }]; });
Lihat pada status penerimaan parameter di latar belakang,
isform kini boleh menerima parameter seperti biasa, dan anda sudah selesai!
Perkara di atas ialah penyelesaian untuk parameter penerimaan latar belakang permintaan pos sudut menjadi batal, saya harap ia akan membantu pembelajaran semua orang.