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



我有一个使用AngularJS 1.5.8的前端项目,该项目与PHP中的API(Laravel框架)进行通信。Preflight OPTIONS请求按预期进行,但我现在面临一个问题,因为我需要知道状态代码为401 Unauthorized的请求何时具体失败。

通过$http(request).then(successFn, errorFn),当调用errorFn时,它有一个Object参数,其状态为-1。当我检查Chrome开发工具上的"网络"选项卡时,请求显然失败了,正如预期的那样,401有没有办法在javascript中获取这些真实的状态代码我看到了一些相关的问题和答案,但大多数都是关于angular的旧版本(在该版本中,使用多个参数(包括status)调用.success方法)。

我是不是错过了API方面的一些东西,还有CORS?还是AngularJS限制?我也用Postman测试了它,它带来了正确的状态代码,甚至是一个完整的JSON对象,带有messagedebug属性(这些属性都没有显示在Chrome的"网络"选项卡中)。

在向正确的方向轻轻推动之后,我发现了如何在项目的前端和后端之间解决这个问题。在Laravel文件api_routes.php中,我将CORS作为中间件插入到每个组中,如下所示:

$api->group([ 'middleware' => ['cors'] ], function($api) {
// ...
});

这并不能确保在请求出错时包含CORS响应头。因此,尽管浏览器捕捉到状态代码401(或其他任何代码),Angular抱怨缺少Access-Control-Allow-Origin,因此javascript中的响应对象非常无用(它没有datastatus-1statusText是空的)。

在我的Laravel项目中,通过将CORS设置为全局中间件,所有必要的头都开始显示出来,甚至在401这样的错误响应中也是如此。

class Kernel extends HttpKernel
{
/**
* The application's global HTTP middleware stack.
*
* These middleware are run during every request to your application.
*
* @var array
*/
protected $middleware = [
IlluminateFoundationHttpMiddlewareCheckForMaintenanceMode::class,
BarryvdhCorsHandleCors::class,
// ...
];
// ...
}

响应对象后来变得非常有用,因为它包含了前面提到的API上指定的所有属性,我设法用状态代码做了我需要的事情。

也许这对处于类似情况的人有所帮助。不过,请注意,由于这是一个全球性的设置,这些标题可能会出现在你意想不到的响应中。如果有人知道更准确的方法,那就太好了!

最新更新