Невозможно добавить CORS для определенного маршрута в Laravel 5

Я использую Laravel 5 для своего приложения, и для установки типа контента я использовал промежуточное ПО CORS, которое выглядит следующим образом.

public function handle($request, Closure $next)
    {
        return $next($request)
            ->header('Access-Control-Allow-Credentials', 'true')
            ->header('Access-Control-Allow-Methods', 'POST, GET, OPTIONS, PUT, DELETE')
            ->header('Access-Control-Allow-Headers', 'Content-Type, Accept, Authorization, X-Requested-With')
            ->header('Content-Type', 'application/json');

    } 

Это функция класса CORS.

Но когда я возвращаю представление Blade, например auth/login, я получаю в браузере простой HTML-код, а не фактическое представление HTML.

Когда я изменяю «Content-Type» на text/html, представления работают, но API, которые возвращают и принимают json, не работают.

Где я ошибаюсь?


person nirvair    schedule 02.06.2015    source источник
comment
-›header('Content-Type', 'application/json');. Это ваша ошибка. Эта строка говорит вашему браузеру отображать контент как фактический JSON, а не HTML-контент. Удалите эту строку, и все в порядке   -  person ChainList    schedule 02.06.2015
comment
Но мне также нужно приложение/json для API.   -  person nirvair    schedule 02.06.2015
comment
Вам нужно создать еще одно промежуточное ПО и использовать его в группе, охватывающей все маршруты вашего API;   -  person ChainList    schedule 02.06.2015


Ответы (1)


Ваша проблема в том, что вы сообщаете баузеру, что отправляете json, но на самом деле отправляете HTML.

Вы можете обойти это, используя следующее.

public function handle($request, Closure $next)
{
    $return = $next($request)
        ->header('Access-Control-Allow-Credentials', 'true')
        ->header('Access-Control-Allow-Methods', 'POST, GET, OPTIONS, PUT, DELETE')
        ->header('Access-Control-Allow-Headers', 'Content-Type, Accept, Authorization, X-Requested-With');

    if ($request->wantsJson())
    {
        $return->header('Content-Type', 'application/json');
    }

    return $return;
}

Используя функцию $request->wantsJson(), вы можете определить, запрашивает ли текущий запрос получение json или нет, он делает это, проверяя принятый заголовок типа контента. См.: https://github.com/laravel/framework/blob/5.0/src/Illuminate/Http/Request.php#L581

person Wader    schedule 02.06.2015