#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' },