我正在使用$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网络标签:
场景2:
使用Restangular
,尝试相同的GET请求
请求:
Restangular.setDefaultHeaders({'Content-Type': 'application/json'})
Restangular.setBaseUrl('/items')
Restangular.all('').getList({customerId: '103020'}, {'Content-Type': 'application/json'});
Chrome网络标签:
这里另一个有趣的部分是,当我在Request Header上做错时,如
Restangular.setDefaultHeaders({'Contentttt-Type': 'application/json'})
并尝试方案1,我在Chrome网络选项卡中注意到以下内容。
场景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网络标签:
问题:
RequestHeader append Content-Type "application/json"
?但是,如果我添加POST
请求,我会收到415错误。Content-Type
将GET
标题附加到其网络调用上?版本:
Angular:1.2.22
Restangular:1.4.0
答案 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头字段是没有意义的。
也许真正想要的东西设置为“接受”?