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

Php 如何从AngularJS 1.5中的CORS请求中获取(真实的)HTTP响应状态代码?,php,angularjs,cors,Php,Angularjs,Cors,我有一个使用AngularJS 1.5.8的前端项目,它与PHP(Laravel框架)中的API进行通信。飞行前选项请求按预期进行,但我现在面临一个问题,因为我需要知道什么时候请求特别失败,状态代码为401 Unauthorized 通过$http(请求)。然后(successFn,errorFn),当调用errorFn时,它有一个状态为-1的对象参数。当我检查Chrome developer tools上的Network(网络)选项卡时,请求显然失败了,正如预期的那样,401有没有办法在jav

我有一个使用AngularJS 1.5.8的前端项目,它与PHP(Laravel框架)中的API进行通信。飞行前选项请求按预期进行,但我现在面临一个问题,因为我需要知道什么时候请求特别失败,状态代码为
401 Unauthorized

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


我是否在API方面遗漏了一些东西,比如CORS?还是一种角度限制?我也用Postman对它进行了测试,它带来了正确的状态代码,甚至是一个完整的JSON对象,带有
message
debug
属性(这些属性都没有出现在Chrome的网络选项卡中)。

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

$api->group([ 'middleware' => ['cors'] ], function($api) {
    // ...
});
这并不能确保在请求出错时包含CORS响应头。因此,尽管浏览器捕捉到一个状态代码
401
(或其他任何东西),Angular还是抱怨缺少
访问控制允许来源
,因此javascript中的响应对象非常无用(它没有
数据
状态
-1
,而
状态文本
是空的)

在我的Laravel项目中,所有必要的标题都开始显示,即使是在错误响应中,如
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 = [
        \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
        \Barryvdh\Cors\HandleCors::class,
        // ...
    ];
    // ...
}
响应对象实际上变得很有用,因为它包含了API上指定的所有前面提到的属性,并且我成功地使用状态代码完成了我需要的操作


也许这对类似情况的人有帮助。不过,请注意,由于这是一个全局设置,这些标题可能会出现在您不希望它们出现的响应中。如果有人知道更精确的方法,那就太好了

否。浏览器正在阻止响应,因为它违反了。后端需要使用正确的CORS头响应选项请求。感谢您确认@georgeawg。事实上,我必须对后端进行更改,现在即使在抛出HttpException时,它也会使用正确的CORS头进行响应。这就是遗漏的案例(我认为对选项请求的响应是可以的)。