Symfony 4 REST API: как правильно включить метод OPTIONS?

Есть клиент, есть сервер. Сервер это API, клиент это JS.

Клиент через AJAX делает запрос к API, первым запросом идет OPTIONS, но в маршрутах API прописаны только методы GET и POST (в зависимости от запроса), но по всем маршрутам сначала идет запрос OPTIONS, который конечно же не проходит проверку.

PHP Fatal error: Uncaught Symfony\Component\Routing\Exception\MethodNotAllowedException

Просто добавив метод OPTIONS во все маршруты решает проблему, но это не выход, ведь в этом случае полностью обрабатываются оба запроса OPTIONS + GET что нехорошо, т.к. OPTIONS не должен ничего выполнять и просто должен вернуть одни заголовки с пустым ответом.

Добавление в заголовках к response Access-Control-Allow-Methods: GET, POST, OPTIONS не дает результата

Как правильно включить OPTIONS?
  • Вопрос задан
  • 2720 просмотров
Решения вопроса 1
voronkovich
@voronkovich
В простейшем случае, вы можете вынести обработку OPTIONS в отдельный метод:

<?php

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;

/**
 * @Route("/blog")
 */
class BlogController extends AbstractController
{
    /**
     * @Route("/", methods="OPTIONS")
     */
    public function options(Request $request): Response
    {
        $response = new Response();

        $response->headers->set('Access-Control-Allow-Methods', 'OPTIONS, GET');

        return $response;
    }

    /**
     * @Route("/", methods="GET", name="blog_index")
     */
    public function index(Request $request): Response
    {
        return $this->json([
            'message' => 'hello',
        ]);
    }
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
miraage
@miraage
Старый прогер
https://github.com/nelmio/NelmioCorsBundle

На заметку: почитайте, что такое CORS; почему эти запросы вообще улетают; какие есть сценарии CORS.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы