我有一个使用AngularJS 1.5.8的前端项目,它与PHP(Laravel框架)中的API通信。预检OPTIONS请求按预期进行,但我现在面临一个问题,因为我需要知道请求是否特别失败,状态代码为401 Unauthorized
。
通过$http(request).then(successFn, errorFn)
,当调用errorFn
时,它有一个Object参数,其状态为-1
。当我检查Chrome开发者工具上的“网络”标签时,请求显然会失败,如预期的那样401
。 有没有办法在javascript中获取这个真实的状态代码?我已经看到了一些相关的问题和答案,但大多数是关于角度的旧版本(其中你有.success
方法被多个参数调用,包括状态)。
我错过了API方面的东西,还有CORS?或者它是AngularJS限制?我也使用Postman测试了它,它带来了正确的状态代码,甚至是整个JSON对象,具有message
和debug
属性(没有一个显示在Chrome的“网络”选项卡中)。 / p>
答案 0 :(得分:1)
在向正确的方向稍微推动之后,我发现了如何在项目的前端和后端之间解决这个问题。在Laravel文件api_routes.php
中,我将CORS作为中间件插入到每个组中,如:
$api->group([ 'middleware' => ['cors'] ], function($api) {
// ...
});
这不能确保在请求变坏时包含CORS响应头。因此,虽然浏览器捕获了状态代码401
(或其他任何内容),但Angular抱怨丢失了Access-Control-Allow-Origin
,因此javascript中的响应对象相当无用(它没有data
,{ {1}}为status
,-1
为空。
在我的Laravel项目中setting CORS as a global middleware,即使出现statusText
等错误回复,也会显示所有必要的标题。
401
然后,响应对象变得非常有用,因为它在API上指定了所有前面提到的属性,并且我设法使用状态代码执行我需要的操作。
也许这有助于处理类似情况的人。但请注意,由于这是一个全局设置,因此这些标题可能会显示在您不想要的响应中。如果有人知道更精确的方式,那就太好了!