Я знаю, что это известная проблема, но я попробовал почти все, и я все еще застрял в этом. У меня есть простой проект, структурированный так:
[Client] => [Gateway] => [API]
Laravel 6 Lumen 6 Lumen 6
localhost:8000 localhost:8001 localhost:8002
Так как я только начал работать над этим проектом только для того, чтобы доказать, работает ли он, я отключил все auth
вещи.
На моем API У меня есть папка в public
с именем uploads
(в основном в http://localhost:8002/uploads/audio.amr
), где у меня есть 1 аудиофайл (.amr), и я пытаюсь Воспроизвести его из представления клиента.
Поскольку html не может воспроизводить файлы .amr, мне пришлось использовать плагин. И я использую этот BenzAMRRecorder .
[Клиентская сторона] Я делаю петицию ajax, чтобы получить URL аудиофайла. клиент через жрет соединяется с шлюзом , а шлюз также делает это с API , и я успешно получил URL http://localhost:8002/uploads/audio.amr
.
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
$.ajax({
url : 'client/get_url_audio',
type : 'GET',
data : {
},
dataType:'json',
success : function(data) {
/** Here's the way to play the file */
var amr = new BenzAMRRecorder();
amr.initWithUrl(data['url']).then(function() {
amr.play();
});
},
});
Я успешно получил URL, но когда BenzAMRRecorder попытался получить доступ к URL http://localhost:8002/uploads/audio.amr
, я получил эту ошибку:
Ошибка :
Доступ к XMLHttpRequest в 'http://localhost: 8002 / uploads / audio.amr ' из источника 'http://localhost: 8000 'был заблокирован политикой CORS: на запрошенном ресурсе отсутствует заголовок' Access-Control-Allow-Origin '.
Я прочитал много способов, чтобы исправить это, и я добавил CorsMiddleware
в API с функцией дескриптора следующим образом:
public function handle($request, Closure $next)
{
$headers = [
'Access-Control-Allow-Origin' => '*',
'Access-Control-Allow-Methods' => 'POST, GET, OPTIONS, PUT, DELETE',
'Access-Control-Allow-Credentials' => 'true',
'Access-Control-Max-Age' => '86400',
'Access-Control-Allow-Headers' => 'Content-Type, Authorization, X-Requested-With'
];
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->middleware([
App\Http\Middleware\Cors::class
]);
Но я все еще получаю та же ошибка. Я подумал, что когда метод amr.initWithUrl(data['url'])
обращается к папке API, он не go получает промежуточное ПО и пытается получить доступ к папкам напрямую без прохождения через промежуточное ПО, но я не не знаю почему. Может кто-нибудь помочь мне решить эту проблему?
РЕДАКТИРОВАТЬ: Я также пытался с github.com/barryvdh/laravel-cors