我正在尝试使用$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
即使使用相同的客户标题也能正常工作?
答案 0 :(得分:0)
使用JSONP(another SO post about it)时,无法发送自定义标头(如授权标头)。如果目标Web服务支持JSONP,则应该使用其他方式进行身份验证,而不是使用标头。该方法将特定于该服务。
除非您必须支持不支持CORS的目标服务,或者您需要支持不支持CORS的旧浏览器,否则您不应该使用JSONP。
解决CORS限制的最佳方法是,如果这是一个问题,就是在您的服务器上构建一个代理,该代理使用适当的标头调用目标服务器。这样,您的Web客户端可以不受任何限制地访问您的服务器,您的服务器可以无任何限制地访问远程API。
答案 1 :(得分:0)
我认为Jsonp很适合你只需要做GET跨域。 CORPS似乎没有简单的GET跨域的开销。 为了确保Jsonp正常工作,您需要从服务器端发回JSON_CALLBACK。 您可以从服务器发送Json回调函数,而不是普通的json响应。
您的服务器响应应该类似于angular.callbacks._0({jsonResponseData})。在您的服务器代码中,您将创建一个响应(基本上是字符串串联)作为响应,而不是发送jsonResponseData。服务器代码大致如下:
var stringForResponse = new StringBuilder();
stringForResponse.Append(callbackFunctionName);
stringForResponse.Append("(");
stringForResponse.Append(jsonResponseData);
stringForResponse.Append(")");
toString = stringForResponse.ToString();