AngularJs $http.post()不发送数据

有人能告诉我为什么下面的语句没有将post数据发送到指定的url吗?url被调用,但在服务器上,当我打印$_POST -我得到一个空数组。如果我在控制台中打印消息,然后将其添加到数据-它显示了正确的内容。

$http.post('request-url',  { 'message' : message });

我也尝试过将数据作为字符串(具有相同的结果):

$http.post('request-url',  "message=" + message);

当我以以下格式使用它时,它似乎正在工作:

$http({
method: 'POST',
url: 'request-url',
data: "message=" + message,
headers: {'Content-Type': 'application/x-www-form-urlencoded'}
});

但是是否有一种方法可以用$http.post() -我总是必须包括头以便它工作吗?我相信上面的内容类型是指定发送数据的格式,但我可以把它作为javascript对象发送吗?

739184 次浏览

你可以这样设置默认的“Content-Type”:

$http.defaults.headers.post["Content-Type"] = "application/x-www-form-urlencoded";

关于data格式:

美元的http。Post和$http。put方法接受任何JavaScript对象(或字符串)值作为其数据参数。如果data是一个JavaScript对象,默认情况下,它将被转换为JSON字符串。

试着使用这种变化

function sendData($scope) {
$http({
url: 'request-url',
method: "POST",
data: { 'message' : message }
})
.then(function(response) {
// success
},
function(response) { // optional
// failed
});
}

我有同样的问题使用asp.net MVC和在这里找到解决方案

对于AngularJS的新手来说,为什么AngularJS是一个错误 $http服务简写函数($http.post()等)似乎不能 可与jQuery的等价物(jQuery.post()等)交换

区别在于jQueryAngularJS如何序列化和传输数据。从根本上说,问题在于你所选择的服务器语言无法理解AngularJS的传输…默认情况下,jQuery传输数据使用

Content-Type: x-www-form-urlencoded

和熟悉的foo=bar&baz=moe序列化。

AngularJS,然而,传输数据使用

Content-Type: application/json

{ "foo": "bar", "baz": "moe" }

JSON序列化,不幸的是一些Web服务器语言-特别是 PHP -不取消原生序列化

效果非常好。

代码

// Your app's root module...
angular.module('MyModule', [], function($httpProvider) {
// Use x-www-form-urlencoded Content-Type
$httpProvider.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=utf-8';
 

/**
* The workhorse; converts an object to x-www-form-urlencoded serialization.
* @param {Object} obj
* @return {String}
*/
var param = function(obj) {
var query = '', name, value, fullSubName, subName, subValue, innerObj, i;
      

for(name in obj) {
value = obj[name];
        

if(value instanceof Array) {
for(i=0; i<value.length; ++i) {
subValue = value[i];
fullSubName = name + '[' + i + ']';
innerObj = {};
innerObj[fullSubName] = subValue;
query += param(innerObj) + '&';
}
}
else if(value instanceof Object) {
for(subName in value) {
subValue = value[subName];
fullSubName = name + '[' + subName + ']';
innerObj = {};
innerObj[fullSubName] = subValue;
query += param(innerObj) + '&';
}
}
else if(value !== undefined && value !== null)
query += encodeURIComponent(name) + '=' + encodeURIComponent(value) + '&';
}
      

return query.length ? query.substr(0, query.length - 1) : query;
};
 

// Override $http service's default transformRequest
$httpProvider.defaults.transformRequest = [function(data) {
return angular.isObject(data) && String(data) !== '[object File]' ? param(data) : data;
}];
});

我知道有接受< em > < / em >答案。但是,如果这个答案因为任何原因不适合他们,下面的内容可能会对未来的读者有所帮助。

Angular不会像jQuery那样使用ajax。当我试图按照指南修改angular $httpprovider时,我遇到了其他问题。例如,我使用codeigniter,其中$this->input->is_ajax_request()函数总是失败(这是由另一个程序员编写的,并在全局使用,所以不能改变),说这不是真正的ajax请求。

为了解决这个问题,我使用了递延的承诺的帮助。我在Firefox和ie9上进行了测试,效果很好。

我有以下函数定义< em > < / em >外的任何角代码。这个函数使常规jquery ajax调用和返回延迟/承诺(我仍在学习)对象。

function getjQueryAjax(url, obj){
return $.ajax({
type: 'post',
url: url,
cache: true,
data: obj
});
}

然后我用下面的代码称它为角代码。请注意,我们必须使用$scope.$apply()手动更新$scope

    var data = {
media: "video",
scope: "movies"
};
var rPromise = getjQueryAjax("myController/getMeTypes" , data);
rPromise.success(function(response){
console.log(response);
$scope.$apply(function(){
$scope.testData = JSON.parse(response);
console.log($scope.testData);
});
}).error(function(){
console.log("AJAX failed!");
});

这可能不是完美的答案,但它允许我使用jquery ajax调用angular,并允许我更新$scope

我也有类似的问题,我想知道这是否也有用:https://stackoverflow.com/a/11443066

var xsrf = $.param({fkey: "key"});
$http({
method: 'POST',
url: url,
data: xsrf,
headers: {'Content-Type': 'application/x-www-form-urlencoded'}
})

问候,

我喜欢使用函数将对象转换为post参数。

myobject = {'one':'1','two':'2','three':'3'}


Object.toparams = function ObjecttoParams(obj) {
var p = [];
for (var key in obj) {
p.push(key + '=' + encodeURIComponent(obj[key]));
}
return p.join('&');
};


$http({
method: 'POST',
url: url,
data: Object.toparams(myobject),
headers: {'Content-Type': 'application/x-www-form-urlencoded'}
})

我在使用AngularJS和Node.js + Express 4 + Router时也遇到了同样的问题

路由器期望从post的请求中得到数据。如果我遵循Angular Docs中的例子,这个主体总是空的

符号1

$http.post('/someUrl', {msg:'hello word!'})

但如果我把它用在数据中

符号2

$http({
withCredentials: false,
method: 'post',
url: yourUrl,
headers: {'Content-Type': 'application/x-www-form-urlencoded'},
data: postData
});

编辑1:

否则node.js路由器将期望req中的数据。正文(如使用符号1):

req.body.msg

它还将信息作为JSON有效负载发送。在json和x-www-form-urlencoded中有数组的某些情况下,这是更好的。

它工作。希望能有所帮助。

上面不是很清楚,但如果你用PHP接收请求,你可以使用:

$params = json_decode(file_get_contents('php://input'),true);

从AngularJS POST中访问PHP中的数组。

根据@felipe-miosso的回答:

  1. 将其作为AngularJS模块从在这里下载,
  2. 安装它
  3. 将它添加到您的应用程序:

    var app = angular.module('my_app', [ ... , 'httpPostFix']);
    

我也遇到过类似的问题,我在做类似的事情,但没有成功。我的Spring控制器无法读取数据参数。

var paramsVal={data:'"id":"1"'};
$http.post("Request URL",  {params: paramsVal});
但是阅读这个论坛和API文档,我试着按照下面的方法,这对我很有效。 如果有人也有类似的问题,你也可以试试下面的方法
$http({
method: 'POST',
url: "Request URL",
params: paramsVal,
headers: {'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8'}
});

请检查https://docs.angularjs.org/api/ng/service/$http#post为什么参数配置。 {data:'"id":"1"'} -字符串或对象的映射将被转换为URL?数据= " id: 1 " < / p >

当我遇到这个问题时,我发布的参数原来是一个对象数组,而不是一个简单的对象。

我没有评论的名声,但作为对don F的回答的回应/补充:

$params = json_decode(file_get_contents('php://input'));

为了正确地返回一个关联数组,true的第二个形参需要添加到json_decode函数中:

$params = json_decode(file_get_contents('php://input'), true);

与JQuery不同的是,出于学究的考虑,Angular使用JSON格式进行POST 数据转移从客户端到服务器端(JQuery应用x-www-form-urlencoded,尽管JQuery和Angular使用JSON进行数据输入)。因此有两个部分的问题:在js客户端部分和在你的服务器部分。所以你需要:

  1. 把js的Angular客户端部分像这样:

    $http({
    method: 'POST',
    url: 'request-url',
    data: {'message': 'Hello world'}
    });
    

AND

  1. write in your server part to receive data from a client (if it is php).

            $data               = file_get_contents("php://input");
    $dataJsonDecode     = json_decode($data);
    $message            = $dataJsonDecode->message;
    echo $message;     //'Hello world'
    

Note: $_POST will not work!

The solution works for me fine, hopefully, and for you.

我在快递上也遇到了同样的问题。为了解决这个问题,你必须在发送HTTP请求之前使用bodyparser来解析json对象。

app.use(bodyParser.json());

刚从angular 1.2更新到1.3,在代码中发现了一个问题。转换资源将导致一个无限循环,因为(我认为)$promise再次持有相同的对象。也许它会帮助到某人……

我可以解决这个问题:

[...]
/**
* The workhorse; converts an object to x-www-form-urlencoded serialization.
* @param {Object} obj
* @return {String}
*/
var param = function (obj) {
var query = '', name, value, fullSubName, subName, subValue, innerObj, i;


angular.forEach(obj, function(value, name) {
+    if(name.indexOf("$promise") != -1) {
+        return;
+    }


value = obj[name];
if (value instanceof Array) {
for (i = 0; i < value.length; ++i) {
[...]

要通过angularjs的$http的Post方法发送数据,您需要更改

data: "message=" + messagedata: $.param({message:message})

我通过以下代码解决了这个问题:

客户端(Js):

     $http({
url: me.serverPath,
method: 'POST',
data: data,
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
}).
success(function (serverData) {
console.log("ServerData:", serverData);
......

注意,data是一个对象。

在服务器端(ASP。NET MVC):

[AllowCrossSiteJson]
public string Api()
{
var data = JsonConvert.DeserializeObject<AgentRequest>(Request.Form[0]);
if (data == null) return "Null Request";
var bl = Page.Bl = new Core(this);


return data.methodName;
}

和'AllowCrossSiteJsonAttribute'需要跨域请求:

public class AllowCrossSiteJsonAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
filterContext.RequestContext.HttpContext.Response.AddHeader("Access-Control-Allow-Origin", "*");
base.OnActionExecuting(filterContext);
}
}

希望这对你有用。

我使用jQuery参数AngularJS帖子请求。这里有一个例子……创建AngularJS应用程序模块,其中myapp是用HTML代码中的ng-app定义的。

var app = angular.module('myapp', []);

现在让我们创建一个登录控制器和POST电子邮件和密码。

app.controller('LoginController', ['$scope', '$http', function ($scope, $http) {
// default post header
$http.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=utf-8';
// send login data
$http({
method: 'POST',
url: 'https://example.com/user/login',
data: $.param({
email: $scope.email,
password: $scope.password
}),
headers: {'Content-Type': 'application/x-www-form-urlencoded'}
}).success(function (data, status, headers, config) {
// handle success things
}).error(function (data, status, headers, config) {
// handle error things
});
}]);

我不喜欢解释代码,它很容易理解:)注意,param来自jQuery,所以你必须同时安装jQuery和AngularJS才能使它工作。这是一个截图。

enter image description here

希望这对你有帮助。谢谢!

我使用asp.net WCF webservices与angular js和以下代码 工作:< / p >
 $http({
contentType: "application/json; charset=utf-8",//required
method: "POST",
url: '../../operation/Service.svc/user_forget',
dataType: "json",//optional
data:{ "uid_or_phone": $scope.forgettel, "user_email": $scope.forgetemail },
async: "isAsync"//optional


}).success( function (response) {


$scope.userforgeterror = response.d;
})

希望能有所帮助。

  var payload = $.param({ jobId: 2 });


this.$http({
method: 'POST',
url: 'web/api/ResourceAction/processfile',
data: payload,
headers: { 'Content-Type': 'application/x-www-form-urlencoded' }
});

WebAPI 2

public class AcceptJobParams
{
public int jobId { get; set; }
}


public IHttpActionResult ProcessFile([FromBody]AcceptJobParams thing)
{
// do something with fileName parameter


return Ok();
}

这段代码为我解决了这个问题。它是一个应用级解决方案:

moduleName.config(['$httpProvider',
function($httpProvider) {
$httpProvider.defaults.transformRequest.push(function(data) {
var requestStr;
if (data) {
data = JSON.parse(data);
for (var key in data) {
if (requestStr) {
requestStr += "&" + key + "=" + data[key];
} else {
requestStr = key + "=" + data[key];
}
}
}
return requestStr;
});
$httpProvider.defaults.headers.post["Content-Type"] = "application/x-www-form-urlencoded";
}
]);

用这种方法。没必要写这么多

 isAuth = $http.post("Yr URL", {username: username, password: password});

在nodejs的后端

app.post("Yr URL",function(req,resp)
{


var username = req.body.username||req.param('username');
var password = req.body.password||req.param('password');
}

我希望这对你们有帮助

这个问题最终在angular 1.4中使用httpParamSerializerJQLike美元解决了

看到https://github.com/angular/angular.js/issues/6039

.controller('myCtrl', function($http, $httpParamSerializerJQLike) {
$http({
method: 'POST',
url: baseUrl,
data: $httpParamSerializerJQLike({
"user":{
"email":"wahxxx@gmail.com",
"password":"123456"
}
}),
headers:
'Content-Type': 'application/x-www-form-urlencoded'
})})

我写了一个小PHP helper函数,允许这两种类型的输入参数:

function getArgs () {
if ($input = file_get_contents('php://input') && $input_params = json_decode($input,true))
return $input_params + $_POST + $_GET;
return $_POST + $_GET;
}

用法:

<?php
include("util.php"); # above code
$request = getArgs();


$myVar = "";
if (isset($request['myVar']))
$myVar = $request['myVar'];
?>

因此不需要修改JavaScript。

我一直在使用公认的答案的代码(Felipe的代码)一段时间,它工作得很好(谢谢,Felipe!)。

然而,最近我发现它有空对象或数组的问题。 例如,当提交这个对象时:

{
A: 1,
B: {
a: [ ],
},
C: [ ],
D: "2"
}

PHP似乎根本看不到B和C。结果是这样的:

[
"A" => "1",
"B" => "2"
]

看看实际的请求在Chrome显示:

A: 1
:
D: 2

我写了一个替代代码片段。它似乎在我的用例中工作得很好,但我还没有对它进行广泛测试,所以请谨慎使用。

我使用TypeScript,因为我喜欢强类型,但它很容易转换为纯JS:

angular.module("MyModule").config([ "$httpProvider", function($httpProvider: ng.IHttpProvider) {
// Use x-www-form-urlencoded Content-Type
$httpProvider.defaults.headers.post["Content-Type"] = "application/x-www-form-urlencoded;charset=utf-8";


function phpize(obj: Object | any[], depth: number = 1): string[] {
var arr: string[] = [ ];
angular.forEach(obj, (value: any, key: string) => {
if (angular.isObject(value) || angular.isArray(value)) {
var arrInner: string[] = phpize(value, depth + 1);
var tmpKey: string;
var encodedKey = encodeURIComponent(key);
if (depth == 1) tmpKey = encodedKey;
else tmpKey = `[${encodedKey}]`;
if (arrInner.length == 0) {
arr.push(`${tmpKey}=`);
}
else {
arr = arr.concat(arrInner.map(inner => `${tmpKey}${inner}`));
}
}
else {
var encodedKey = encodeURIComponent(key);
var encodedValue;
if (angular.isUndefined(value) || value === null) encodedValue = "";
else encodedValue = encodeURIComponent(value);


if (depth == 1) {
arr.push(`${encodedKey}=${encodedValue}`);
}
else {
arr.push(`[${encodedKey}]=${encodedValue}`);
}
}
});
return arr;
}


// Override $http service's default transformRequest
(<any>$httpProvider.defaults).transformRequest = [ function(data: any) {
if (!angular.isObject(data) || data.toString() == "[object File]") return data;
return phpize(data).join("&");
} ];
} ]);

它的效率比Felipe的代码低,但我认为这无关紧要,因为与HTTP请求本身的整体开销相比,它应该是即时的。

现在PHP显示:

[
"A" => "1",
"B" => [
"a" => ""
],
"C" => "",
"D" => "2"
]

据我所知,让PHP识别B.a和C是空数组是不可能的,但至少键会出现,当代码依赖于某个结构时,这很重要,即使它内部实际上是空的。

还要注意,它将__abc0和__abc1转换为空字符串。

没有找到如何使用$http的完整代码片段。Post方法将数据发送到服务器,以及为什么在这种情况下它不工作。

以下代码段的解释…

  1. 我使用jQuery $。param函数将JSON数据序列化为www post data
  2. 在配置变量中设置Content-Type,该变量将随angularJS $http请求一起传递。通知服务器我们将以WWW Post格式发送数据。

  3. 注意$ http。post方法,我发送的第一个参数作为url,第二个参数作为数据(序列化)和第三个参数作为配置。

剩下的代码是自己理解的。

$scope.SendData = function () {
// use $.param jQuery function to serialize data from JSON
var data = $.param({
fName: $scope.firstName,
lName: $scope.lastName
});


var config = {
headers : {
'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8;'
}
}


$http.post('/ServerRequest/PostDataResponse', data, config)
.success(function (data, status, headers, config) {
$scope.PostDataResponse = data;
})
.error(function (data, status, header, config) {
$scope.ResponseDetails = "Data: " + data +
"<hr />status: " + status +
"<hr />headers: " + header +
"<hr />config: " + config;
});
};

查看美元http。这里的Post方法的代码示例。

如果你使用PHP,这是从AngularJS POST中访问PHP数组的简单方法。

$params = json_decode(file_get_contents('php://input'),true);

在你的js文件中添加这个:

$http.defaults.headers.post["Content-Type"] = "application/x-www-form-urlencoded";

并添加到您的服务器文件:

$params = json_decode(file_get_contents('php://input'), true);

这应该有用。

通过使用非常简单的方法,我们可以这样做:

 $http({
url : "submit_form_adv.php",
method : 'POST',
headers: {'Content-Type': 'application/x-www-form-urlencoded'},
transformRequest: function(obj) {
var str = [];
for(var p in obj)
str.push(encodeURIComponent(p)+' = '+encodeURIComponent(obj[p]));


return str.join('&');
},
data : {sample_id : 100, sample_name: 'Abin John'},


}).success(function(data, status, headers, config) {


}).error(function(ata, status, headers, config) {


});

把你想要发送的数据作为第二个参数:

$http.post('request-url',  message);

另一种同样有效的形式是:

$http.post('request-url',  { params: { paramName: value } });

确保paramName与你正在调用的函数的形参名称完全匹配。

来源:AngularJS后快捷方法

这不是角的错。Angular是为JSON设计的。因此,当$http服务发送AJAX请求时,它将所有数据作为有效负载发送,而不是作为表单数据发送,以便后端应用程序可以处理它。但是jQuery在内部做一些事情。你指示jQuery的$ajax模块将form-data绑定为JSON,但在发送ajax请求之前,它将JSON序列化并添加application/x-www-form-urlencoded报头。这样,您的后端应用程序能够接收表单数据形式的post参数,而不是JSON。

但是你可以修改angular $http服务的默认行为

  1. 添加标题
  2. 序列化json

$httpParamSerializerJQLike是angular的内置服务,它以同样的方式序列化json。jQuery的参数。

$http({
method: 'POST',
url: 'request-url',
data: $httpParamSerializerJQLike(json-form-data),
headers: {
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8;'
}
});

如果你需要一个插件先将表单数据序列化成JSON,使用这个https://github.com/marioizquierdo/jquery.serializeJSON

如果使用Angular >= 1.4,下面是使用Angular提供的序列化器的最干净的解决方案:

angular.module('yourModule')
.config(function ($httpProvider, $httpParamSerializerJQLikeProvider){
$httpProvider.defaults.transformRequest.unshift($httpParamSerializerJQLikeProvider.$get());
$httpProvider.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded; charset=utf-8';
});

然后你可以简单地在你的应用的任何地方做这个:

$http({
method: 'POST',
url: '/requesturl',
data: {
param1: 'value1',
param2: 'value2'
}
});

它将正确地将数据序列化为param1=value1&param2=value2,并将其与application/x-www-form-urlencoded; charset=utf-8 Content-Type头一起发送到/requesturl,这通常是端点上的POST请求所期望的。

博士TL;

在我的研究中,我发现这个问题的答案有很多种;一些是非常复杂的,依赖于自定义函数,一些依赖于jQuery和一些是不完整的,建议你只需要设置头。

如果你只是设置了Content-Type标头,终点将看到POST数据,但它不会是标准格式,因为除非你提供一个字符串作为你的data,或手动序列化你的数据对象,它将在默认情况下被序列化为JSON,并可能在终点被错误地解释。

例如,如果在上面的例子中没有设置正确的序列化器,它将在端点中被视为:

{"param1":"value1","param2":"value2"}

这可能导致意想不到的解析,例如ASP。NET将其视为null参数名,{"param1":"value1","param2":"value2"}作为值;或者Fiddler以另一种方式解释它,{"param1":"value1","param2":"value2"}作为参数名,null作为值。

这可能是一个比较晚的答案,但我认为最合适的方法是使用angular在执行“get”请求时使用的同一段代码,使用你的$httpParamSerializer将不得不将它注入到你的控制器 所以你可以简单地做下面的事情,而不需要使用Jquery, $http.post(url,$httpParamSerializer({param:val})) < / p >
app.controller('ctrl',function($scope,$http,$httpParamSerializer){
$http.post(url,$httpParamSerializer({param:val,secondParam:secondVal}));
}

类似OP建议的工作格式&Denison的答案,除了使用$http.post而不是$http,仍然依赖于jQuery。

在这里使用jQuery的好处是可以正确地传递复杂对象;反对手动转换为URL参数,可能会混淆数据。

$http.post( 'request-url', jQuery.param( { 'message': message } ), {
headers: { 'Content-Type': 'application/x-www-form-urlencoded' }
});

在我的例子中,我是这样解决问题的:

var deferred = $q.defer();


$http({
method: 'POST',
url: 'myUri',
data: $.param({ param1: 'blablabla', param2: JSON.stringify(objJSON) }),
headers: { 'Content-Type': 'application/x-www-form-urlencoded' }
}).then(
function(res) {
console.log('succes !', res.data);
deferred.resolve(res.data);
},
function(err) {
console.log('error...', err);
deferred.resolve(err);
}
);
return deferred.promise;

您需要使用JSON。为每个包含JSON对象的参数进行stringify,然后使用"$. stringify "构建数据对象。param”:-)

注意:我的“objJSON”是一个JSON对象,包含数组,整数,字符串和html内容。他的总大小是>3500个字符。

找到了简单的解决方法

http://jasonwatmore.com/post/2014/04/18/post-a-simple-string-value-from-angularjs-to-net-web-api

return $http.post(Config.apiUrl + '/example/processfile', '"' + fileName + '"');

只是提出一个现代化的@FelipeMiosso的回答版本:

.config(["$httpProvider", function ($httpProvider) {


function buildKey(parentKey, subKey) {
return parentKey + "[" + subKey + "]";
}


function buildObject(key, value) {
var object = {};
object[key] = value;
return object;
}


function join(array) {
return array.filter(function (entry) {
return entry;
}).join("&");
}


function arrayToQueryString(parentKey, array) {
return join(array.map(function (value, subKey) {
return toQueryString(buildObject(buildKey(parentKey, subKey), value));
}));
}


function objectToQueryString(parentKey, object) {
return join(Object.keys(object).map(function (subKey) {
return toQueryString(buildObject(buildKey(parentKey, subKey), object[subKey]));
}));
}


function toQueryString(input) {
return join(Object.keys(input).map(function (key) {
var value = input[key];
if (value instanceof Array) {
return arrayToQueryString(key, value);
} else if (value instanceof Object) {
return objectToQueryString(key, value);
} else if (undefined !== value && null !== value) {
return encodeURIComponent(key) + "=" + encodeURIComponent(value);
} else {
return "";
}
}));
}


function isQueryStringEligible(input) {
return null !== input && "object" === typeof input && "[object File]" !== String(input);
}


var interceptor = [function () {
return {
request: function (config) {
if (0 <= ["post", "put", "patch"].indexOf(config.method.toLowerCase()) && isQueryStringEligible(config.data)) {
config.headers["Content-Type"] = "application/x-www-form-urlencoded;charset=utf-8";
config.data = toQueryString(config.data);
}
return config;
}
};
}];


$httpProvider.interceptors.push(interceptor);


}])

ES6版本:

.config(["$httpProvider", function ($httpProvider) {


"use strict";


const buildKey = (parentKey, subKey) => `${parentKey}[${subKey}]`;


const buildObject = (key, value) => ({ [key]: value });


const join = (array) => array.filter((entry) => entry).join("&");


const arrayToQueryString = (parentKey, array) =>
join(array.map((value, subKey) =>
toQueryString(buildObject(buildKey(parentKey, subKey), value))));


const objectToQueryString = (parentKey, object) =>
join(Object.keys(object).map((subKey) =>
toQueryString(buildObject(buildKey(parentKey, subKey), object[subKey]))));


const toQueryString = (input) => join(Object.keys(input).map((key) => {
const value = input[key];
if (value instanceof Array) {
return arrayToQueryString(key, value);
} else if (value instanceof Object) {
return objectToQueryString(key, value);
} else if (undefined !== value && null !== value) {
return `${encodeURIComponent(key)}=${encodeURIComponent(value)}`;
} else {
return "";
}
}));


const isQueryStringEligible = (input) =>
null !== input && "object" === typeof input && "[object File]" !== String(input);


const interceptor = [() => ({
request(config) {
if (0 <= ["post", "put", "patch"].indexOf(config.method.toLowerCase()) && isQueryStringEligible(config.data)) {
config.headers["Content-Type"] = "application/x-www-form-urlencoded;charset=utf-8";
config.data = toQueryString(config.data);
}
return config;
}
})];


$httpProvider.interceptors.push(interceptor);


}])

我有这个问题,问题是我不能得到的数据,而张贴使用上述标题,即。

headers: {
'Accept': 'application/json',
'Content-Type': 'application/x-www-form-urlencoded'
}

当使用jquery Ajax时,我们通常在后端服务器上获取response.body中的数据,但在实现Angular Ajax时,数据不会得到响应。相反,它倒在了下面

request.getParameterMap.keySet().iterator().next()