最近,我开始遇到CORS的问题,因为许多人在我面前感到高兴。我可以使用以下设置针对我的本地环境解决此问题。目前,该应用仍在开发中,因此我知道我可能应该在发布该应用之前限制CORS的起源。
CORS-中间件
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
header('Access-Control-Allow-Origin: *');
//ALLOW OPTIONS METHOD
$headers = [
'Access-Control-Allow-Methods' => 'POST, GET, OPTIONS, PUT, DELETE',
'Access-Control-Allow-Headers' => 'Content-Type, X-Auth-Token, Origin, Authorization',
];
if ($request->getMethod() == "OPTIONS"){
//The client-side application can set only headers allowed in Access-Control-Allow-Headers
return response()->json('OK',200, $headers);
}
$response = $next($request);
foreach ($headers as $key => $value) {
$response->header($key, $value);
}
return $response;
}
内核
protected $middleware = [
//Other middlewares
\App\Http\Middleware\Cors::class,
];
这解决了我在本地环境(宅基地)中使用CORS所面临的问题。不幸的是,现在我的测试在CircleCI中失败了。所以问题是我如何启用CORS内容,以便再次运行测试。
示例测试
public function test_we_can_retrieve_all_places() {
$response = $this->get('api/places');
$response
->assertStatus(200);
}
测试输出:预期状态码为200,但已收到500。无法断言false为真。
[如果其他任何人都可能遇到上述错误,则以下步骤可帮助我解决问题。
首先,我在测试中添加了dd($respone)
,它输出了很多不太有用的东西。但是它也会转储可能的异常。我能够发现的例外之一是下面的例外。
Laravel phpunit Cannot modify header information - headers already sent
我为解决该问题所做的工作将上面的代码调整为以下代码:
//ALLOW OPTIONS METHOD
$headers = [
'Access-Control-Allow-Origin' => '*',
'Access-Control-Allow-Methods' => 'POST, GET, OPTIONS, PUT, DELETE',
'Access-Control-Allow-Headers' => 'Content-Type, X-Auth-Token, Origin, Authorization',
];
这解决了我的错误