如何从AngularJS 1.5中的CORS请求中获取(实际)HTTP响应状态代码?

时间:2017-02-09 12:21:13

标签: php angularjs cors

我有一个使用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对象,具有messagedebug属性(没有一个显示在Chrome的“网络”选项卡中)。 / p>

1 个答案:

答案 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上指定了所有前面提到的属性,并且我设法使用状态代码执行我需要的操作。

也许这有助于处理类似情况的人。但请注意,由于这是一个全局设置,因此这些标题可能会显示在您不想要的响应中。如果有人知道更精确的方式,那就太好了!