$rootScope.ajaxRequestPost = function (requestUrl, data, successCallback) { var transFn = function (data) { return $.param(data); }; var postCfg = { headers: {'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'}, transformRequest: transFn }; $http.post(requestUrl, data, postCfg).success(function (resultJson) { if (resultJson.success) { //回调业务 successCallback(resultJson); } }).error(function (e) { console.log('系统异常'); }); };
注意,在使用$http 提交请求时,配置了postCfg,其内部用了jquery.param方法,贴一段w3school上对该方法的说明:
param() 方法创建数组或对象的序列化表示。该序列化值可在进行 AJAX 请求时在 URL 查询字符串中使用
注意到,如果提交的参数就是简单的表单,一切OK。例如常用的SpringMVC举例
比如
class A{ String xx; } public CommonResult update(HttpServletRequest request,HttpServletResponse response, @ModelAttribute A a) { }
但是一旦A变成了复杂对象,其Jquery特有的序列化方式,将后导致后端处理时的异常:
class A{ B b; } class B{ String xx; }
这时候该怎么办呢,解决方案如下:
1 修改post方法,采用angularJS默认方法: $http.post(requestUrl, data)
2 修改后端方法,采用@RequestBody
public CommonResult update(HttpServletRequest request,HttpServletResponse response, @RequestBody A a) {
}
实际上的不同就是,前者提交时,任是以key-value的形式提交;而后者提交时,直接将A的json串放在了body中了
至于ModelAttribute 和 RequestBody 注解有什么不同,百度一下