【问题标题】:Laravel 5 making DELETE request by ajax - method not allowedLaravel 5 通过 ajax 发出 DELETE 请求 - 不允许的方法
【发布时间】:2016-04-27 00:38:25
【问题描述】:

我正在尝试使用 ajax 在 Laravel 应用程序中发出 DELETE 请求

我有一个功能可以向资源发出请求 - 使用正确的动词 - 但不断出现不允许的方法:

这是我的 ajax 请求:

$.ajax({
            type: 'DELETE',
            url:'/user/58',
            data: {
                '_method': 'DELETE',
                'id': id
            },
            dataType: 'json',
            success: function (data) {
                // do something with ajax data
                if (data.result) {
                    return true;
                }

                return false;

            },
            error: function (xhr, ajaxOptions, thrownError) {
                console.log('error...', xhr);
                return false;
                //error logging
            },
            complete: function () {
                //afer ajax call is completed
            }
        });

id 在函数中提供,测试为 58。

在 Chrome 中观看网络面板,我可以看到它以 user/58 的预期 URL 开头,但随后很快缩短为 user

我知道要获取资源路由以获取请求,它需要是 user/58 和方法 DELETE,因此它将转到 destroy 方法,因此它被路由到 Index 方法,该方法需要GET 请求,因此该方法不允许。

为什么我的请求网址被更改了?

在 Laravel 中发出 DELETE 请求的正确方法是什么?

谢谢

编辑: 这是我的路线:

Route::group( [ 'middleware' => [ 'auth' , 'admin' ] ] , function ()
{
Route::resource( 'user' , 'UserController' );
} );

在标头中处理 csrf 令牌 - 可以肯定这不是问题的原因,因为我没有收到无效令牌异常

$.ajaxSetup({
        headers: {
            'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
        }
    });

谢谢

【问题讨论】:

  • "为什么我的请求 url 被更改了?" — 大概是因为服务器响应一个 Location 标头来重定向请求。
  • 请问您能出示您的routes.php 和Controller 文件吗?
  • 在使用 Ajax 时,是否有任何类型的对 URL 的身份验证检查可能会失败?你想过需要的 CSRF Token 吗?见laravel.com/docs/5.2/routing#csrf-x-csrf-token

标签: php jquery ajax laravel


【解决方案1】:

这里可能会发生两件事,我需要将其写在比评论更长的帖子中,所以希望我做对了。

我想到的第一件事是在执行 ajax 请求时失败的身份验证检查。如果您没有足够的权限,至少我会将您重定向回主要资源。

但是,我的第二个猜测可能更有可能。你有没有想过需要用ajax请求发送的X-CSRF-TOKEN?见https://laravel.com/docs/5.2/routing#csrf-x-csrf-token


来自文档:

除了检查 CSRF 令牌作为 POST 参数,Laravel VerifyCsrfToken 中间件还会检查 X-CSRF-TOKEN 请求头。例如,您可以将令牌存储在“元”标签中:

<meta name="csrf-token" content="{{ csrf_token() }}">

创建元标记后,您可以指示 jQuery 之类的库将令牌添加到所有请求标头。这为基于 AJAX 的应用程序提供了简单、方便的 CSRF 保护:

$.ajaxSetup({
        headers: {
            'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
        }
});

【讨论】:

  • 啊!您的第一个假设几乎就在那里,并为我指明了正确的方向 - 它在控制器中失败并重定向回 index 方法。我没有发现这一点,因为正在观看方法不允许错误并假设它来自原始请求,而实际上它来自重定向。现在用头撞墙 - 哦!谢谢
  • 很高兴能帮上忙!
  • @Joshua-Pendo:在寻找类似问题时遇到了这篇文章。您能否指导我找到正确的方向,以便在以下位置找到帖子:
    stackoverflow.com/questions/46096989/…
猜你喜欢
  • 1970-01-01
  • 2020-03-19
  • 1970-01-01
  • 2019-03-25
  • 1970-01-01
  • 2018-03-07
  • 2018-08-22
  • 2013-12-07
  • 2015-03-24
相关资源
最近更新 更多