После бессонной ночи я, наконец, решил проблему, и это была не проблема с Angular или моим кодом в нем, а скорее конфигурация веб-сервера.
Если кто-то испытывает что-то подобное, этот ответ может предоставить потенциальное решение, и это пример книги предварительного запроса :
Предварительный запрос CORS - это запрос CORS, который проверяет чтобы понять, понятен ли протокол CORS, и знает ли сервер, используя определенные методы и заголовки.
Это запрос OPTIONS, использующий три заголовка HTTP-запроса: Access-Control-Request-Method, Access-Control-Request -Headers и заголовок Origin.
Это означает, что перед каждым из запросов, сделанных приложением Angular, был еще один, который проверял бы параметры CORS на сервере через OPTIONS
request.
Настройка моего сервера и Lumen / Laravel Настройка CORS все время не выполнялась. Вот как мой CorsMiddleware
выглядит с самого начала:
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
/**
* Class CorsMiddleware
* @package App\Http\Middleware
*/
class CorsMiddleware
{
/**
* Handle an incoming request.
*
* @param Request $request
* @param Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
$headers = [
'Access-Control-Allow-Credentials' => 'true',
'Access-Control-Max-Age' => '86400',
'Access-Control-Allow-Methods' => 'POST, GET, OPTIONS, PUT, PATCH, HEAD, DELETE',
'Access-Control-Allow-Headers' => 'X-Requested-With, Content-Type, Accept, Origin, Authorization',
'Access-Control-Expose-Headers' => 'X-Requested-With, Content-Type, Accept, Origin, Authorization',
'Access-Control-Allow-Origin' => '*',
];
if ($request->isMethod('OPTIONS')) {
return response()->json(['method' => 'OPTIONS'], 200, $headers);
}
$response = $next($request);
foreach($headers as $key => $value) {
$response->header($key, $value);
}
return $response;
}
}
Затем это промежуточное программное обеспечение корректно внедряется в bootstrap/app.php
как:
$app->routeMiddleware([
'cors' => App\Http\Middleware\CorsMiddleware::class,
...,
]);
При запуске этого промежуточного программного обеспечения все Заголовки отправляются в ответе на запрос, но это утверждение в CorsMiddleware
никогда не достигало этого условия, даже если я пытался с Почтальоном:
if ($request->isMethod('OPTIONS')) {
return response()->json(['method' => 'OPTIONS'], 200, $headers);
}
Причиной тому было то, что routes/web.php
не обрабатывать любой запрос OPTIONS
, так что он обрабатывался самим веб-сервером, и поскольку я использовал Apache с .htaccess
, это также вызывало некоторые незначительные проблемы, но я не хотел придерживаться Apache справиться с этим. Я хотел придерживаться соглашения о том, что большинство вещей обрабатываются Lumen / Laravel.
Итак, чтобы мой CorsMiddleware
перехватил запрос OPTIONS
, я решена вся эта проблема с добавлением этого поверх моего основного routes/web.php
файла:
Route::options('/{any:.*}', ['middleware' => ['cors']]);
Теперь упомянутый выше случай OPTIONS
в CorsMiddleware
, который никогда не случается, как это происходит, и это решено вся моя проблема.