一尘不染

AngularJS-$ http.post是否可以发送请求参数而不是JSON?

javascript

我有一些旧代码通过jQuery的post方法发出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&param2=value2&param3=value3

我要命中的端点期望请求参数而不是JSON。因此,我的问题是是否仍然要告诉$http.post发送JavaScript对象作为请求参数而不是JSON?是的,我知道我可以自己从对象构造字符串,但是我想知道Angular是否为此提供了开箱即用的功能。


阅读 293

收藏
2020-04-25

共1个答案

一尘不染

我认为paramsconfig参数在这里不起作用,因为它将字符串添加到url而不是正文中,但是要添加到Infeligo建议的内容中,这是默认转换的全局替代示例(使用jQuery
param作为转换示例数据到参数字符串)。

设置全局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
    });
2020-04-25