我试图访问我不控制的REST服务。第一个问题是该服务不包含Access-Control-Allow-Origin头,这是一个问题,如果我理解正确,立即将我限制为JSONP。
此外,默认情况下,此服务发送XML而不是JSON,尽管它能够发送JSON。我认为它应该回应我的Accept标题,服务负责人说它看起来在我的内容类型。这意味着我需要做一个POST而不是一个GET(虽然当我刚刚得到一些静态数据时,get会更有意义,对吧?)。
固执,因为我在尝试我的Accept头。由于角只接受JSON,我希望它默认使用Accept: application/json
头,但它没有,而忽略我尝试手动设置:
app.config(['$httpProvider', function($httpProvider){
console.log($httpProvider.defaults.headers.common);
delete $httpProvider.defaults.headers.common['X-Requested-With'];
$httpProvider.defaults.headers.post['Accept'] = 'application/json, text/javascript';
$httpProvider.defaults.headers.post['Content-Type'] = 'application/json; charset=utf-8';
$httpProvider.defaults.headers.post['Access-Control-Max-Age'] = '1728000';
$httpProvider.defaults.headers.common['Access-Control-Max-Age'] = '1728000';
$httpProvider.defaults.headers.common['Accept'] = 'application/json, text/javascript';
$httpProvider.defaults.headers.common['Content-Type'] = 'application/json; charset=utf-8';
$httpProvider.defaults.useXDomain = true;
}]);
我在实际的资源再这样做:
return $resource('http://foo.com/getStuff', {}, {
fetch: {
method:'JSONP',
params: params,
headers: {
'Accept':'application/json, text/javascript',
'Content-Type':'application/json; charset=utf-8'
},
isArray:false,
callback: 'JSON_CALLBACK'
}
});
但尽管如此,请求头包含Accept: */*
。
我的问题是:为什么?为什么Angular忽略我的头文件?我怎样才能让它使用正确的头文件呢?
还有:有没有办法在POST中使用JSONP?
编辑:本来我使用的是Angular 1.0.7,但我只是用1.2.3试过,得到了相同的结果。标题被忽略,但大家都声称这是做到这一点的方法。
我也试着用$ http直接做,而不是用$ resource做,结果相同。
编辑2:这里是JSFiddle。它是匿名的,不使用我的真实服务器,但使用Firebug /开发人员工具,可以验证它在两个呼叫上都发送了Accept: */*
,尽管我多次试图设置application/json
标题。这是我真正的问题。在我的真实服务器上,我得到了一个XML结果,尽管我真正的服务器能够发送JSON。
(无论是真实的服务器支持JSONP是目前较少有关这个虚拟的服务器显然没有,不过没关系我只关心头。)
编辑3:我已经尝试了两种解决方案,建议如下:
$http.defaults.headers.common['Accept'] = 'application/json, text/javascript';
$http.defaults.transformRequest.push(function (data, headersGetter) {
headersGetter().Accept = "application/json, text/javascript";
return data;
});
我已经尝试了两个报表分别。在控制器中,然后在http呼叫本身之前的服务中。仍然不起作用。
有人可以给我一个的jsfiddle这何处显示工作?
编辑4:我注意到,当我使用GET而不是JSONP时,Accept头是正确的。但是,由于它没有正确的标题,因此拒绝回应。
应在JSONP调用有什么样的头?因为有在JSONP调用了很多头,但没有将其标识为JSONP。服务器是否必须有明确的JSONP支持才能正常工作?我突然意识到我对jsonp的了解不够。
您确定您使用的WebService是否响应您的请求的有效[JSONP](http://en.wikipedia.org/wiki/JSONP)? 我注意到的第一件事是,你没有正确设置你的'callback'查询参数。 ''resource'应该是:'...,params:{callback:'JSON_CALLBACK'},...'如果可能的话,请提供一个Plunk或者JSFiddle,这样我们就可以玩你的代码了。 – vucalur
我相信它不会以有效的JSONP响应。它向我发送XML,可能是因为我没有发送正确的标题。我现在的主要问题是正确设置标题,以便服务知道向我发送json或jsonp。 – mcv
我知道,这就是为什么我建议首先查看您的REQUEST URL( - :.每个使用JSONP响应的WebService都在URL查询字符串中搜索'callback',并且永远不会用JSONP响应,因为它需要'callback'参数值得这样做 它基本上提取'callback'参数值并发送:'<< callback_param_value >>(<< response_JSON_object >>);'回给你'application/javascript' – vucalur