前言:我使用的是AngularJS 1.5.9。
编写服务时,此代码在发布到服务器时有效:
var request = {
url: '/connect/token',
method: 'POST',
data: $httpParamSerializer(params),
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
}
};
$http(request).then(function(response) {});
但是,当$ http具有使用参数data
时,使用params
似乎违反直觉,并按照AngularJS's documentation定义了以下定义:
params - {Object。} - 字符串或对象的映射 将使用paramSerializer序列化并作为GET附加 参数。
如您所见,文档指定此参数仅用于GET请求。当我尝试在我的POST请求中使用params参数时,我确认了这一点:
var request = {
url: '/connect/token',
method: 'POST',
params: params,
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
}
};
$http(request).then(function(response) {});
以这种方式提交POST请求时,您会从服务器获得以下响应:
{
"error":"invalid_request",
"error_description":"A malformed token request has been received: the mandatory 'Content-Type' header was missing from the POST request."
}
换句话说,如果我没有使用data参数并在我要传入的参数上调用param序列化程序服务,我的自定义服务就不会设置Content-Type
标头我的请求,我已经在网络检查员的网络标签中确认了这一点。
TLDR; 为什么我必须使用data参数并序列化params而不是直接使用params
参数?当我使用params
参数时,为什么我指定的内容类型会被忽略?
答案 0 :(得分:0)
对params
次请求使用GET
选项。
使用params
选项,您可以设置网址查询字符串参数,例如baseurl.com?myParam=something