发出POST请求时,$ http data vs params

时间:2017-01-28 18:01:17

标签: angularjs xmlhttprequest

前言:我使用的是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参数时,为什么我指定的内容类型会被忽略?

1 个答案:

答案 0 :(得分:0)

params次请求使用GET选项。

使用params选项,您可以设置网址查询字符串参数,例如baseurl.com?myParam=something