Laravel 5通过ajax发出DELETE请求 - 不允许使用方法

时间:2016-01-20 23:06:27

标签: php jquery ajax laravel

我尝试使用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的预期网址开头,但很快就缩短为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')
        }
    });

由于

1 个答案:

答案 0 :(得分: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"标记:

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

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

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