AngularJS免不了和web服务端交互,贴一段代码
$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 注解有什么不同,百度一下