解决angular的post请求后SpringMVC后台接收不到参数值问题的方法
这是我后台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; }
前台页面发送一个post提交表单的请求
发现后台没有取到值
后边我想到的第一种方案是在控制器方法参数里加requestbody来接收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; }
但是isform的值结果还是为null,
接着我又对比了下以前的项目中,接收post请求的参数,发现一个有趣的现象,
下边是angular的默认请求头:
$httpprovider.defaults.headers.post: (header defaults for post requests)
content-type: application/json
$httpprovider.defaults.headers.put(header defaults for put requests)
content-type: application/json
其中angular的post和put都是application/json,
而jquery的post请求的"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'; });
接下来的请求body变成了这样,但是后边还是没有取到isform的值,
又查了半天,在一个老外的博客上发现了原因:
by default, jquery transmits data using content-type: x-www-form-urlencoded and the familiar foo=bar&baz=moe serialization. angularjs, however, transmits data using content-type: application/json and { "foo": "bar", "baz": "moe" } json serialization
自己翻译了:
默认情况下,jquery传输数据使用content-type: x-www-form-urlencodedand和类似于"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的post请求风格一致了,有木有!!!
看下后台的参数接收情况,
isform已经可以正常接收到参数了,大功告成!
以上就是angular的post请求后台接收参数为null的解决方案,希望对大家的学习有所帮助。
上一篇: Java编程思想学习录(连载之:内部类)
下一篇: Redis的HelloWorld
推荐阅读
-
解决angular的post请求后SpringMVC后台接收不到参数值问题的方法
-
解决angular的$http.post()提交数据时后台接收不到参数值问题的方法
-
axios发送post请求springMVC接收不到参数的解决方法
-
解决Vue axios post请求,后台获取不到数据的问题方法
-
解决angular的post请求后SpringMVC后台接收不到参数值问题的方法
-
解决angular的$http.post()提交数据时后台接收不到参数值问题的方法
-
axios发送post请求springMVC接收不到参数的解决方法
-
解决angular的post请求后SpringMVC后台接收不到参数值问题的方法_AngularJS
-
解决angular的post请求后SpringMVC后台接收不到参数值问题的方法_AngularJS
-
解决angular的$http.post()提交数据时后台接收不到参数值问题的方法_AngularJS