我有一些旧代码通过jQuery的post方法发出AJAX POST请求,看起来像这样:
$.post("/foo/bar", requestData, function(responseData) { //do stuff with response }
requestData 只是具有一些基本字符串属性的javascript对象。
requestData
我正在移动我们的内容以使用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发送如下内容:
$.post
param1=value1¶m2=value2¶m3=value3
我要命中的端点期望请求参数而不是JSON。因此,我的问题是是否仍然要告诉$http.post发送JavaScript对象作为请求参数而不是JSON?是的,我知道我可以自己从对象构造字符串,但是我想知道Angular是否为此提供了开箱即用的功能。
$http.post
我认为paramsconfig参数在这里不起作用,因为它将字符串添加到url而不是正文中,但是要添加到Infeligo建议的内容中,这是默认转换的全局替代示例(使用jQuery param作为转换示例数据到参数字符串)。
params
设置全局transformRequest函数:
var app = angular.module('myApp'); app.config(function ($httpProvider) { $httpProvider.defaults.transformRequest = function(data){ if (data === undefined) { return data; } return $.param(data); } });
这样,对$ http.post的所有调用都会自动将主体转换为jQuery $.post调用所使用的相同参数格式。
请注意,您可能还想按以下方式为每次调用或全局设置Content-Type标头:
$httpProvider.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded; charset=UTF-8';
每个调用的样本非全局transformRequest:
var transform = function(data){ return $.param(data); } $http.post("/foo/bar", requestData, { headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'}, transformRequest: transform }).success(function(responseData) { //do stuff with response });