Je suis un débutant à Laravel et je convertis une application php/jquery en Laravel. Le code d'origine utilisait un tableau JSON avec un ajax POST, qui était récupéré comme ceci:
$json = file_get_contents('php://input');
$data = json_decode($json,true);
Je fais à peu près la même chose du côté POST, mais je ne vois aucune donnée arriver dans ma collection de requêtes Laravel $. Dois-je faire quelque chose de spécial pour récupérer des données JSON structurées comme suit:
[
{ "name": "John", "location": "Boston" },
{ "name": "Dave", "location": "Lancaster" }
]
Voici mon code jQuery ajax POST (avec des données codées en dur)
$.ajax({
type: "POST",
url: "/people",
data: '[{ "name": "John", "location": "Boston" }, { "name": "Dave", "location": "Lancaster" }]',
dataType: "json",
success:function(data) {
$('#save_message').html(data.message);
}
});
Voici le code dans mon contrôleur qui reçoit le POST
public function store(Request $request)
{
dd($request->all());
}
Mais tout ce que je reçois c'est:
[]
Des idées sur la façon dont je peux récupérer mes données?
Vous devez changer votre appel Ajax en
$.ajax({
type: "POST",
url: "/people",
data: '[{ "name": "John", "location": "Boston" }, { "name": "Dave", "location": "Lancaster" }]',
contentType: "json",
processData: false,
success:function(data) {
$('#save_message').html(data.message);
}
});
remplacez dataType
par contentType
et ajoutez l'option processData
.
Pour récupérer la charge JSON de votre contrôleur, utilisez:
dd(json_decode($request->getContent(), true));
au lieu de
dd($request->all());
$postbody='';
// Check for presence of a body in the request
if (count($request->json()->all())) {
$postbody = $request->json()->all();
}
Voici comment cela est fait dans laravel 5.2.
Juste une mention avec jQuery v3.2.1 et Laravel 5.6.
Cas 1: L'objet JS posté directement, comme:
$.post("url", {name:'John'}, function( data ) {
});
Le code Laravel PHP correspondant doit être:
parse_str($request->getContent(),$data); //JSON will be parsed to object $data
Cas 2 : La chaîne JSON publiée, comme:
$.post("url", JSON.stringify({name:'John'}), function( data ) {
});
Le code Laravel PHP correspondant doit être:
$data = json_decode($request->getContent(), true);
Depuis Laravel 5.2+, vous pouvez le récupérer directement avec $request->input('item')
.
Récupération des valeurs d'entrée JSON
Lorsque vous envoyez des demandes JSON à votre application, vous pouvez accéder au fichier Données JSON via la méthode de saisie tant que l'en-tête Content-Type de la demande est correctement définie sur application/json. Vous pouvez même utiliser Syntaxe "point" pour creuser plus profondément dans les tableaux JSON:
$ name = $ request-> input ('user.name');
https://laravel.com/docs/5.2/requests
Comme indiqué ci-dessus, l'en-tête content-type doit être défini sur application/json
pour que l'appel ajax jQuery doive inclure contentType: "application/json",
.
$.ajax({
type: "POST",
url: "/people",
data: '[{ "name": "John", "location": "Boston" }, { "name": "Dave", "location": "Lancaster" }]',
dataType: "json",
contentType: "application/json",
success:function(data) {
$('#save_message').html(data.message);
}
});
En réparant l'appel AJAX, $request->all()
devrait fonctionner.