404 Ошибка не найдена в опциях предварительного просмотра при выполнении метода PUT в CakePHP API с помощью axios в React App - PullRequest
2 голосов
/ 31 мая 2019

Итак, у нас есть API с CakePHP 3.7.Мы используем resources для генерации методов CRUD.API размещен на сервере с apache2 и доступен через приложение менеджера с помощью React (это приложение является микросервисом).Менеджер выполняет вызовы через axios и правильно управляет запросами GET, POST и HEAD (простые запросы CORS), но у нас возникают проблемы, когда речь идет о более сложных запросах, таких как PUT или DELETE.

При выполнении запросов PUT или DELETE он выполняет предварительный запрос OPTIONS и возвращает ошибку 404 Not Found.И некоторые сообщения в консоли, связанные с CORS:

Мы уже пробовалинесколько исправлений, таких как плагин CakePHP CORS , добавление заголовков CORS в ответ в методах beforeRender и beforeFilter AppController, а также добавление заголовков CORS в apache, ни один из этих швов не работал.

    private function setCorsHeaders() {
        $this->response->cors($this->request)
            ->allowOrigin(['*'])
            ->allowMethods(['*'])
            ->exposeHeaders(['X-Total-Pages'])
            ->maxAge(800)
            ->build();
    }

    public function beforeRender(Event $event)
    {
        $this->setCorsHeaders();
    }

    public function beforeFilter(Event $event)
    {
        if($this->request->is('options')) {
            $this->setCorsHeaders();
            return $this->response;
        }
    }
Header set Access-Control-Expose-Headers "X-Total-Pages"
Header set Access-Control-Allow-Origin "*"
Header set Access-Control-Allow-Methods "GET,HEAD,PUT,PATCH,POST,DELETE,OPTIONS"

Ожидаемое поведение состоит в том, что методы PUT и DELETE выполняются должным образом (предварительные параметры должны пройти успешно).Любая помощь приветствуется.

1 Ответ

1 голос
/ 01 июня 2019

В CakePHP> = 3.4, Http\Response объекты обрабатываются как неизменяемые многими методами. Цепочка методов, вызываемая на $this->request->cors(), использует класс CorsBuilder для постановки нужных заголовков в неизменяемый ответ, который возвращается при вызове build().

Попробуйте назначить возврат из CorsBuilder::build() с заголовками в очереди на $this->response.

    private function setCorsHeaders() {
        $this->response = $this->response->cors($this->request)
            ->allowOrigin(['*'])
            ->allowMethods(['*'])
            ->exposeHeaders(['X-Total-Pages'])
            ->maxAge(800)
            ->build();
    }
...