Content-Type标头未使用Angular $ http设置

时间:2014-07-22 18:44:29

标签: angularjs http-headers xmlhttprequest cors

我尝试使用Angular $ http和以下代码进行跨源POST请求。

//I've tried setting and removing these http config options
$http.defaults.useXDomain = true;
delete $http.defaults.headers.common['X-Requested-With'];
$http.defaults.headers.common['Content-Type'] = 'application/x-www-form-urlencoded';

//Basic request, with some private headers removed
return $http({
    method: 'POST',
    //withCredentials:true,
    headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'},
    params: params,
    url: url
});

预检OPTIONS请求获得200 OK,但后续POST收到400 Bad Request响应。查看Chrome调试窗口中的跟踪,我没有看到POST的Content-Type: application/x-www-form-urlencoded; charset=UTF-8标头。我假设这就是服务器返回错误请求响应的原因。

我设置了一些我从上面的代码中省略的其他自定义标题,并且它们正在被发送并显示正常。

我还应该提一下,我可以使用Chrome的Advanced Rest Client应用程序发出此请求并收到正确的回复。 (访问令牌)

我也试过做一个直接的XMLHttpRequest(),但是我得到了同样的错误。

有关我的Content-Type标头未设置原因的任何见解?

5 个答案:

答案 0 :(得分:11)

如果您没有发送任何数据,我不确定会发送Content-Type标头。添加data对象并尝试:

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

另外,通常在帖子中使用data代替params(获取)。

如果需要,您还可以参考此SO问题,其中包含有关如何转换数据的更多信息:How can I post data as form data instead of a request payload?

答案 1 :(得分:7)

如果未定义数据属性,则不会将“Content-Type”标头添加到请求中,例如,您可以将空字符串作为数据“”发送。

 var req = {
                method: 'GET',
                url: '<your url here>',
                //headers: {
                //    'Content-Type': 'application/json;charset=utf-8'
                //},
                data: ""
            };
  $http(req);

答案 2 :(得分:1)

我的问题是我将data变量设置为对象而不是字符串。

return $http({
    method: 'POST',
    //withCredentials:true,
    headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'},
    data: {'key1':'value1', 'key2':'value2'},
    url: url
});

我将其更改为data:'key1=value1&key2=value2'后效果很好。还有一个反斜杠,我必须手动输入%5c代码。

答案 3 :(得分:1)

比你非常多&#34; Liran B&#34;你的修复工作对我来说就像一个冠军....问题让我困扰了几个小时....

var req = {
                method: 'GET',
                url: '<your url here>',
                //headers: {
                //    'Content-Type': 'application/json;charset=utf-8'
                //},
                data: ""
            };

  $http(req);

答案 4 :(得分:1)

我在设置标题时面临同样的问题。我们需要在$http请求中发送数据参数,如此

$http({
    method: 'POST',
    headers: { 'Content-Type': 'application/json},
    data: {},
    url: url
}); 

我们也可以发送空白数据。它会工作正常。