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

use*_*608 7 xmlhttprequest http-headers cors angularjs

我正在尝试使用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
});
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

有关为什么我的Content-Type标头没有被设置的任何见解?

luc*_*uma 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
});
Run Code Online (Sandbox Code Playgroud)

此外,通常使用一个帖子data而不是params(get).

如果需要,您还可以参考这个有关如何转换数据的更多信息的SO问题: 如何将数据作为表单数据而不是请求有效负载发布?


Lir*_*niv 7

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

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