Je fais une demande ajax avec jquery et je veux envoyer une donnée au serveur (l'id du bouton cliqué) pour que je puisse faire la bonne requête et retourner la bonne réponse. L'idée est qu'après avoir cliqué sur un bouton, je devrais faire l'appel ajax pour demander une table de données. Ma fonction jquery ressemble à ceci:
$('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>' }
]
} );
Mon itinéraire est comme ci-dessous:
Route::post('/dep/fetch/workers' , 'DepsController@fetch_workers')->name('workerDepData');
Ma fonction fetch_workers à l'intérieur du contrôleur a ce code:
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;
}
Après avoir cliqué sur le bouton, j'obtiens une erreur et lorsque je vérifie la réponse du serveur en raison de la demande ajax, je vois un fichier json qui a une exception à
Symfony\Component\HttpKernel\Exception\HttpException.
Je vérifie ce type d'exception et j'ai vu que c'était dû à un itinéraire utilisant get au lieu de post. Mon itinéraire, comme vous pouvez le voir, utilise la poste, donc je ne comprends pas pourquoi cette exception.
Comme je l'ai mentionné dans les commentaires. Son [~ # ~] csrf [~ # ~] problème de jeton.
Afin de le réparer
1) Vous pouvez exclure votre URI pour CSRF
2) Vous pouvez mettre csrf_token () dans votre requête ajax.
Des explications détaillées peuvent être trouvées ici https://laravel.com/docs/5.5/csrf
Vous devez inclure le jeton CSRF sous forme de lame et méthode de publication.
var _token = $("input[name='_token']").val();
et passer avec d'autres données.
data: { _token:_token , etc:etc },
s'amuser :)
Dans toutes les dernières version supérieure à 5.6, vous pouvez utiliser comme ceci
<form method="POST" action="YOUR_ACTION">
@csrf
...
</form>
Laravel: Pour ceux qui sont confrontés à un problème csrf avec ajax dans laravel
<?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>';
}
?>