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

时间:2016-10-24 15:44:33

标签: jquery ajax laravel

我试图通过AJAX将一些数据发送到我的Laravel应用程序。

我使用jQuery作为AJAX位。

我尝试使用的HTTP methodPATCH

我希望在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异常)......当我在{{1}上不使用method时,它确实识别出欺骗性JSON.stringify并且所有工作都有效但是我需要这样做才能使一切工作。

我觉得我很亲密,我只需要放一些代码,也许是一个新的中间件类并通过它来路由这些请求,以便我可以成功欺骗data方法?

有什么想法吗?

谢谢!

1 个答案:

答案 0 :(得分: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;
}

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

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