我有一些通过jQuery's post method发出AJAX POST请求的旧代码,如下所示:
$.post("/foo/bar", requestData,
function(responseData)
{
//do stuff with response
}
requestData
只是一个带有一些基本字符串属性的javascript对象。
我正在将我们的东西转移到使用Angular的过程中,我想用$http.post替换这个调用。我想出了以下几点:
$http.post("/foo/bar", requestData).success(
function(responseData) {
//do stuff with response
}
});
当我这样做的时候,我从服务器得到了一个500错误响应。使用Firebug时,我发现这会像这样发送请求正文:
{"param1":"value1","param2":"value2","param3":"value3"}
成功的jQuery $.post
会像这样发送正文:
param1=value1¶m2=value2¶m3=value3
我遇到的端点需要的是请求参数,而不是JSON。所以,我的问题是,有没有办法告诉$http.post
将javascript对象作为请求参数发送,而不是JSON?是的,我知道我可以自己从对象构造字符串,但我想知道Angular是否提供了开箱即用的功能。
发布于 2013-04-24 01:27:34
使用jQuery的$.param
函数在requestData中序列化JSON数据。
简而言之,使用与您的代码类似的代码:
$http.post("/foo/bar",
$.param(requestData),
{
headers:
{
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
}
}
).success(
function(responseData) {
//do stuff with response
}
});
要使用它,您必须在页面中与AngularJS一起包含jQuery。
发布于 2015-12-24 03:31:32
注意,从Angular 1.4开始,您可以不使用jQuery来序列化表单数据。
在app.js中:
module.run(function($http, $httpParamSerializerJQLike) {
$http.defaults.transformRequest.unshift($httpParamSerializerJQLike);
});
然后在你的控制器中:
$http({
method: 'POST',
url: myUrl',
headers: {'Content-Type': 'application/x-www-form-urlencoded'},
data: myData
});
发布于 2013-05-02 12:25:18
我在设置自定义http身份验证时也有问题,因为$resource缓存了请求。
要使其正常工作,您必须通过执行以下操作覆盖现有的标头
var transformRequest = function(data, headersGetter){
var headers = headersGetter();
headers['Authorization'] = 'WSSE profile="UsernameToken"';
headers['X-WSSE'] = 'UsernameToken ' + nonce
headers['Content-Type'] = 'application/json';
};
return $resource(
url,
{
},
{
query: {
method: 'POST',
url: apiURL + '/profile',
transformRequest: transformRequest,
params: {userId: '@userId'}
},
}
);
我希望我能帮助到别人。我花了3天才弄明白这个问题。
https://stackoverflow.com/questions/12190166
复制相似问题