$ http标题'内容类型'没有附加在标题中 - AngularJS

时间:2016-01-27 10:50:03

标签: angularjs http http-headers http-get restangular

我正在使用$http执行GET请求,并且我想在标头中添加'Content-Type': 'application/json'。如果我没有附加此标头415 (Unsupported Media Type),则会抛出错误。

我使用Apache 2.2.13与ProxyPass,其中我不RequestHeader append Content-Type "application/json"。但是,如果我将RequestHeader配置放在apache $http.get中工作正常,并且'Content-Type'也会附加。

场景1: 使用$http,尝试GET请求

请求:

$http({
    method: 'GET',
    headers: { 'Content-type': 'application/json'},
    url: '/items/?customerId=5656'
});

Chrome网络标签:

enter image description here

场景2: 使用Restangular,尝试相同的GET请求

请求:

Restangular.setDefaultHeaders({'Content-Type': 'application/json'})
Restangular.setBaseUrl('/items')
Restangular.all('').getList({customerId: '103020'}, {'Content-Type': 'application/json'});

Chrome网络标签:

enter image description here

这里另一个有趣的部分是,当我在Request Header上做错时,如 Restangular.setDefaultHeaders({'Contentttt-Type': 'application/json'}) 并尝试方案1,我在Chrome网络选项卡中注意到以下内容。

enter image description here

场景3: 使用jQuery ajax,尝试相同的GET请求

请求:

$.ajax({
         url: "/items/?customerId=103020",
         type: "GET",
         beforeSend: function(xhr){xhr.setRequestHeader('Content-Type', 'application/json');},
         success: function() { alert('Success!'); }
      });

Chrome网络标签:

enter image description here

问题:

  1. 是否有必要在Apache配置中添加RequestHeader append Content-Type "application/json"?但是,如果我添加POST请求,我会收到415错误。
  2. AngularJS和Restangular有什么问题,它不会Content-TypeGET标题附加到其网络调用上?
  3. 解决此问题的最佳解决方案是什么?我已尝试过所有组合,但没有运气!
  4. 版本:

    Angular:1.2.22

    Restangular:1.4.0

2 个答案:

答案 0 :(得分:3)

一方面,使用$http服务,您可以在模块上调用$httpProvider方法时使用config覆盖或添加标题:

module.config(function($http) {
  $httpProvider.defaults.headers.get = { 'Content-Type : 'application/json' };
});

另一方面,使用GET方法,如果您的API确实是RESTFull,则只应设置Accept标头,因为您没有发送JSON数据。

因此,对您的PUT / POST方法使用上述代码,并强制使用Accept方法的GET标题:

module.config(function($http) {
$httpProvider.defaults.headers.post = { 'Content-Type : 'application/json'};
$httpProvider.defaults.headers.put = { 'Content-Type : 'application/json'};
$httpProvider.defaults.headers.get = { 'Accept : 'application/json'};
});

编辑1:

如果您想在content-type请求中强制GET,则必须添加空白数据:

$http({
    method: 'GET',
    data:'',
    dataType:'json',
    headers: { 'Content-type': 'application/json'},
    url: '/items/?customerId=5656'
});

答案 1 :(得分:2)

在没有请求主体(例如GET)的HTTP请求上设置Content-Type头字段是没有意义的。

也许真正想要的东西设置为“接受”?