$ http.jsonp无法按预期工作 - 始终返回401错误

时间:2014-08-25 01:54:52

标签: json angularjs http-status-code-404 http-get http-status-code-401

我正在尝试使用$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即使使用相同的客户标题也能正常工作?

2 个答案:

答案 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();