我正在尝试使用AngularJS的$ http服务构建一个JSONP请求,并且在出现错误时我得到的错误是http状态代码404而不是500,并且页面正文也丢失了。
所以这是场景:
我正在调用的URL返回500内部服务器错误,其中包含错误消息的JSON输出:
http://private.peterbagi.de/jsfiddle/ng500status/api.php?code=500&callback=test
index.html
(见行动:http://private.peterbagi.de/jsfiddle/ng500status/)
while (foo)
{
}
app.js
<!DOCTYPE HTML>
<html lang="en-US">
<head>
<meta charset="UTF-8">
<title></title>
<script src= "//ajax.googleapis.com/ajax/libs/angularjs/1.5.5/angular.min.js"></script>
<script src= "app.js"></script>
</head>
<body ng-app="app" ng-controller="UploadController">
<button ng-click="upload(200)" value="OK">OK</button>
<button ng-click="upload(500)" value="Fail">Fail</button>
<pre>{{response | json}}</pre>
</body>
</html>
当您单击“失败”按钮时,返回的状态为404和 反应机构也不见了。
输出
var app = angular.module('app', []);
app.constant('BASE_URL','http://private.peterbagi.de/jsfiddle/ng500status/');
app.controller("UploadController", ['$scope','Upload','BASE_URL',
function($scope,Upload,BASE_URL) {
$scope.upload = function(code) {
Upload(code).then( function(response) {
$scope.response = response;
}, function(error) {
$scope.response = error;
} );
}
}]);
app.factory('Upload', ['$http','BASE_URL', function($http,BASE_URL) {
return function (code) {
var callUrl = BASE_URL + "api.php?code="+code;
return $http({
method: 'JSONP',
url : callUrl+"&callback=JSON_CALLBACK"
});
}
}]);
在Chrome DevTools网络面板中,您会看到正确的响应代码(500),我希望在Angular输出中看到相同的结果。
为什么会发生这种情况或我做错了什么?
更新
我构建了一个类似的示例,但使用GET-Requests而不是JSONP并且效果很好:http://private.peterbagi.de/jsfiddle/ng500status2/
这似乎是JSONP特定的问题。然而,它并没有解决我最初的问题,因为我必须使用跨域请求。有什么想法吗?
答案 0 :(得分:8)
根据角度来源 httpBackend.js line 63和line 190,
JSONP&#39;的状态请求只能是-1,404或200。
原因在于有角度的JSONP&#39;请求不是XMLHttpRequest。 AFAIK无法以这种方式处理特定的错误代码。 javascript知道的唯一事情就是这个请求是否成功。
<强>更新强>:
以上我的回答:
JSONP&#39;的状态请求只能是-1,404或200。
这表示此请求的响应由angular提供的状态。
XMLHttpRequest 是我们通常在ajax中使用的标准请求类型。它向服务器发送请求并获取响应,以便您可以看到服务器给出的HTTP状态代码(200,404,500,401等)侧。
但是,它有限制,就像大多数情况下你不能创建跨域 XMLHttpRequest (除非你在服务器端设置了allow-cross-domain
标题)。 / p>
通过这种方式,我们需要 JSONP 来帮助我们制作跨域请求。事实上&#39; jsonp&#39;将<script>
标记附加到您的文档(请求完成时始终删除),其src
属性是您提供的网址。
在角度中,会将侦听器添加到此<script>
以跟踪请求的状态。但是,这些侦听器只能判断script
是否已成功加载。如果成功,则角度将响应的状态设置为200.如果不成功,则分配404。这就是为什么状态字段是404或200,无论服务器实际给出了什么。