我试图使用 $http.jsonp
从服务器获取json格式字符串,但它总是报告 404 error
. 当我使用 Fidder
拦截它时,我发现它报告 401 error
.
同时,当我使用 $http.get
时,我发现它可以正常工作 .
var jsonpUrl = "http://SHABVJ7S12/versioning/history?orderBy=0&callback=JSON_CALLBACK";
$http.defaults.headers.common.Authorization = 'Basic TldEOEtLSDk4R0VKOkI4a3hld2JJeDdNcDlQdVFJc2t6aEh2NjF6cyUzRA==';
$http.jsonp(jsonpUrl, {}).success(function (data, status) {
alert('succ ' + status);
}).error(function (data, status) {
alert('err ' + status);
});
}
我很困惑,为什么报告 401 error
,但使用 $http.get
具有相同的授权信息时返回正常 .
为什么 $http.jsonp
总是返回 401 error
而 $http.get
即使使用相同的客户 Headers 也能正常工作?
2 回答
使用JSONP(another SO post about it)时,无法发送自定义标头(如授权标头) . 如果目标Web服务支持JSONP,则应该使用其他方式进行身份验证,而不是使用标头 . 该方法将特定于该服务 .
您不应该使用JSONP,除非您必须由于目标服务不支持CORS或者您需要支持不支持CORS的旧浏览器 .
解决CORS限制的最佳方法是,如果这是一个问题,就是在您的服务器上构建一个代理,该代理使用适当的头来调用目标服务器 . 这样,您的Web客户端可以无任何限制地访问您的服务器,您的服务器可以无任何限制地访问远程API .
我认为Jsonp很适合你只需要做GET跨域 . CORPS似乎没有简单的GET跨域的开销 . 为了确保Jsonp正常工作,您需要从服务器端发回JSON_CALLBACK . 您将从服务器发送Json回调函数,而不是普通的json响应 .
您的服务器响应应该类似angular.callbacks._0() . 在您的服务器代码中,您将创建一个响应(基本上是字符串串联)作为响应,而不是发送jsonResponseData . 服务器代码大致如下: