我正在使用jquery执行ajax请求,我想将一个数据发送到服务器(单击按钮的id),这样我就可以进行正确的查询并返回正确的响应。我的想法是,在单击按钮后,我应该进行ajax调用以请求数据表。 我的jquery函数如下所示:
$('button').click(function(){
var dep_id = $(this).attr('id');
var table = $('#dataTable').DataTable( {
"processing": true,
"serverSide": true,
"ajax": {
"url" : '{!! route('workerDepData') !!}' ,
"type" : "POST" ,
"data" : { id: dep_id }
},
columns: [
{ data: 'id', name: 'id' },
{ data: 'worker_name' , name:'name' },
{ data: 'role', name: 'role' },
{ data: 'dep_name' , name:'dep_id'} ,
{ data: 'created_at', name: 'created_at' } ,
{
"className": "details",
"orderable": false,
"data": null,
"defaultContent": '<button class="btn btn-success" id="show">Show</button>' }
]
} );
我的路线如下:
Route::post('/dep/fetch/workers' , 'DepsController@fetch_workers')->name('workerDepData');
我在控制器内部的fetch_workers函数有以下代码:
public function fetch_workers()
{
$workers = DB::table('workers')
->where('workers.dep_id' , '=' ,request('id'))
->join('departaments' , 'workers.dep_id' , '=' , 'departaments.id')
->select('workers.id' , 'workers.name as worker_name' , 'workers.role' , 'departaments.name as dep_name' , 'workers.created_at')
->get();
$ajaxResponse = Datatables::of($workers)->make(true);
return $ajaxResponse;
}
点击按钮后,我收到一个错误,当我因为ajax请求检查服务器的响应时,我看到一个json文件在
处有异常的Symfony \元器件\ HttpKernel \异常\ HttpException。
我检查了这种异常,我看到它是由于使用get而不是post的路由。你可以看到我的路线是使用帖子所以我不明白为什么这个例外。
答案 0 :(得分:24)
正如我在评论中提到的那样。其 CSRF 令牌问题。
为了解决这个问题
1)您可以排除CSRF的URI
2)您可以将csrf_token()放入您的ajax请求中。
找到答案 1 :(得分:5)
您必须同时以刀片形式和post方法添加CSRF令牌。
var _token = $("input[name='_token']").val();
并与其他数据一起传递。
data: { _token:_token , etc:etc },
玩得开心:)
答案 2 :(得分:0)
Laravel:对于那些在laravel中使用Ajax遇到csrf问题的人
<?php
if(condition){
$updated_field = 'User' ;
$id = $t->updated_value;
echo '<script type="text/javascript">';
echo '$(document).ready(function(){
var updated_value ='. $id .';
//alert(updated_value);
$.ajaxSetup({
headers : { "X-CSRF-TOKEN" :jQuery(`meta[name="csrf-token"]`). attr("content")}
});
$.ajax({
type:"POST",
url : "get_username",
data : { id: id },
success: function(){
console.log(data);
}
});
});';
echo '</script>';
}
?>
答案 3 :(得分:0)
在5.6以上的最新版本中,您可以像这样使用
<form method="POST" action="YOUR_ACTION">
@csrf
...
</form>