我尝试使用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')
}
});
由于
答案 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')
}
});