【问题标题】:How can I get the (real) HTTP response status code from a CORS request in AngularJS 1.5?如何从 AngularJS 1.5 中的 CORS 请求中获取(真实)HTTP 响应状态代码?
【发布时间】:2025-12-19 18:00:11
【问题描述】:

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

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

我在 API 方面是否缺少 CORS 方面的内容?还是它是 AngularJS 的限制?我也用 Postman 对其进行了测试,它带来了正确的状态码,甚至是一个完整的 JSON 对象,带有 messagedebug 属性(这些都没有显示在 Chrome 的那个网络选项卡中)。

【问题讨论】:

  • 没有。浏览器阻止响应,因为它违反了Same Origin Policy。后端需要使用正确的 CORS 标头来响应 OPTIONS 请求。
  • 感谢您确认@georgeawg。实际上,我必须对后端进行更改,现在即使抛出 HttpException ,它也会以正确的 CORS 标头响应。那是丢失的情况(我认为对 OPTIONS 请求的响应是好的)。

标签: php angularjs cors


【解决方案1】:

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

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

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

setting CORS as a global middleware 在我的 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 上指定的所有上述属性,并且我设法使用状态代码完成了我需要的操作。

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

【讨论】: