最近项目遇到一个表单参数传递问题:
后台resful接口定义参数接受类型是restEasy的@FormParams 而页面是直接ajax调用接口,没遇到过这种情况,需要接口接收到自己组装的参数体
查了下找到如下解决办法:
$http({
method : 'POST',
url : '/role/edit',
data : $.param($scope.formData), // pass in data as strings
headers : { 'Content-Type': 'application/x-www-form-urlencoded' }
// set the headers so angular passing info as form data (not request payload)
}) .success(function(data) {
console.log(data);
}) .error(function(data) {
console.log(data);
})
关键点有两个:
1.数据传输格式:序列化
data : $.param($scope.formData), // pass in data as strings
2:设置内容类型
'Content-Type': 'application/x-www-form-urlencoded'
这里讲下jquery的param() 方法
1.param() 方法创建数组或对象的序列化表示。
2.该序列化值可在进行 AJAX 请求时在 URL 查询字符串中使用。
param() 方法用于在内部将元素值转换为序列化的字符串表示。请参阅 .serialize() 了解更多信息。
对于 jQuery 1.3,如果传递的参数是一个函数,那么用 .param() 会得到这个函数的返回值,而不是把这个函数作为一个字符串来返回。
对于 jQuery 1.4,.param() 方法将会通过深度递归的方式序列化对象,以便符合现代化脚本语言的需求,比如 PHP、Ruby on Rails 等。你可以通过设置 jQuery.ajaxSettings.traditional = true; 来全局地禁用这个功能。
如果被传递的对象在数组中,则必须是以 .serializeArray() 的返回值为格式的对象数组:
[{name:"first",value:"Rick"}, {name:"last",value:"Astley"}, {name:"job",value:"Rock Star"}]
注意:因为有些框架在解析序列化数字的时候能力有限,所以当传递一些含有对象或嵌套数组的数组作为参数时,请务必小心!
在 jQuery 1.4 中,HTML5 的 input 元素也会被序列化。