Исправление Laravel AJAX — отправить _method: ‘исправление’ в данных

#jquery #ajax #laravel

#jquery #ajax #laravel

Вопрос:

Я пытаюсь отправить некоторые данные через AJAX в мое приложение Laravel.

Я использую jQuery для бита AJAX.

HTTP method Я пытаюсь это сделать с помощью PATCH .

Я хочу включить имя метода (patch) в data и сохранить type как POST , поскольку это обеспечит большую совместимость с браузером.

Я все настроил, используя PATCH как type , и все работало нормально.

Затем я изменил type на POST и вставил в data имя метода ‘поддельное’. Затем все перестало работать.

Вот мой текущий AJAX-код:

 var request = $.ajax({
        headers: { 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') },
        url: ajaxURL,
        type: "POST",
        data: JSON.stringiy({_method: "PATCH", more_data:[the_data]}),
        dataType: "json"
    });

    request.done(function( msg ) {
        alert(JSON.stringify(msg));
    });
  

Теперь вышеупомянутое работает в том смысле, что оно успешно выполняется. Но Laravel не распознает поддельный метод (и выдает исключение MethodNotAllowed)… Он распознает подделку method , и все работает, когда я не использую JSON.stringify на data , но мне нужно сделать это таким образом, чтобы все работало.

Я чувствую, что я очень близок к этому, и мне просто нужно ввести некоторый код, возможно, новый класс промежуточного программного обеспечения и направить эти запросы через него, чтобы я мог успешно подделать PATCH HTTP метод?

Есть идеи?

Спасибо!

Ответ №1:

Вот как в Laravel проверить метод запроса ( vendor/Symfony/http-foundation/Request.php )

 public function getMethod()
{
    if (null === $this->method) {
        $this->method = strtoupper($this->server->get('REQUEST_METHOD', 'GET'));

        if ('POST' === $this->method) {
            if ($method = $this->headers->get('X-HTTP-METHOD-OVERRIDE')) {
                $this->method = strtoupper($method);
            } elseif (self::$httpMethodParameterOverride) {
                $this->method = strtoupper($this->request->get('_method', $this->query->get('_method', 'POST')));
            }
        }
    }

    return $this->method;
}
  

Как вы можете видеть, вам нужен заголовок send X-HTTP-METHOD-OVERRIDE для правильного дескриптора маршрута. В вашем случае вы можете просто добавить

 headers: { 'X-HTTP-Method-Override': 'PATCH' },