首页 文章

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

提问于
浏览
0

我试图使用 $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 回答

  • 0

    使用JSONP(another SO post about it)时,无法发送自定义标头(如授权标头) . 如果目标Web服务支持JSONP,则应该使用其他方式进行身份验证,而不是使用标头 . 该方法将特定于该服务 .

    您不应该使用JSONP,除非您必须由于目标服务不支持CORS或者您需要支持不支持CORS的旧浏览器 .

    解决CORS限制的最佳方法是,如果这是一个问题,就是在您的服务器上构建一个代理,该代理使用适当的头来调用目标服务器 . 这样,您的Web客户端可以无任何限制地访问您的服务器,您的服务器可以无任何限制地访问远程API .

  • 0

    我认为Jsonp很适合你只需要做GET跨域 . CORPS似乎没有简单的GET跨域的开销 . 为了确保Jsonp正常工作,您需要从服务器端发回JSON_CALLBACK . 您将从服务器发送Json回调函数,而不是普通的json响应 .

    您的服务器响应应该类似angular.callbacks._0() . 在您的服务器代码中,您将创建一个响应(基本上是字符串串联)作为响应,而不是发送jsonResponseData . 服务器代码大致如下:

    var stringForResponse = new StringBuilder();
                    stringForResponse.Append(callbackFunctionName);
                    stringForResponse.Append("(");
                    stringForResponse.Append(jsonResponseData);
                    stringForResponse.Append(")");
                    toString = stringForResponse.ToString();
    

相关问题