Laravel AJAX 补丁 - 在数据中发送 _method:'patch'

Laravel AJAX Patch - send _method:'patch' in the data

我正在尝试通过 AJAX 向我的 Laravel 应用程序发送一些数据。

我正在使用 jQuery 作为 AJAX 位。

我正在尝试使用的 HTTP methodPATCH

我想在 data 中包含方法名称(补丁)并将 type 保留为 POST,因为这将确保更好的浏览器兼容性。

我使用 PATCH 作为 type 设置了所有内容,一切正常。

然后我将 type 更改为 POST 并将 'spoofed' 方法名称放在 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.stringifydata,但我需要这样做才能使一切正常。

我觉得我已经很接近了,我只需要放一些代码,也许是一个新的中间件 class 并通过它来路由这些请求,这样我就可以成功地欺骗 PATCH HTTP 方法?

有什么想法吗?

谢谢!

这里是如何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;
}

如您所见,您需要发送 X-HTTP-METHOD-OVERRIDE header 以获得正确的路由句柄。在您的情况下,您只需添加

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