【问题标题】:Content-Type header not being set with Angular $http没有使用 Angular $http 设置 Content-Type 标头
【发布时间】:2014-09-13 17:46:27
【问题描述】:

我正在尝试使用带有以下代码的 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 标头没有被设置的见解?

【问题讨论】:

标签: angularjs xmlhttprequest http-headers


【解决方案1】:

如果您不发送任何数据,我不确定是否会发送 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?

【讨论】:

  • 好的,谢谢。我现在意识到了。当我传递一些数据时,标题会出现。不过,仍然收到400 Bad Request。所以我想这个问题已经回答了,但我仍然得到同样的回应。不知道发生了什么。
  • 您的问题是关于 Content-Type。如果您对 400 请求有单独的问题,请使用特定代码位(服务器和客户端)创建一个新问题。我的猜测是您没有在请求中发送令牌(在标头中???)
  • 我正在发送数据,但仍未设置。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    我在设置标题时遇到了同样的问题。我们需要像这样在$http请求中发送数据参数

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

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

    【讨论】:

    • 数据参数为必填项
    【解决方案4】:

    我的问题是我将 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&amp;key2=value2',它就可以正常工作。那里还有一个反斜杠,我必须手动输入%5c 代码。

    【讨论】:

    【解决方案5】:

    比你非常“Liran B”你的修复对我来说就像一个冠军......问题困扰了我几个小时......

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-22
      • 2013-12-10
      • 2015-05-05
      • 2011-01-04
      • 1970-01-01
      • 2017-11-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多