Php 如何从AngularJS 1.5中的CORS请求中获取(真实的)HTTP响应状态代码?
我有一个使用AngularJS 1.5.8的前端项目,它与PHP(Laravel框架)中的API进行通信。飞行前选项请求按预期进行,但我现在面临一个问题,因为我需要知道什么时候请求特别失败,状态代码为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
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头进行响应。这就是遗漏的案例(我认为对选项请求的响应是可以的)。