web-dev-qa-db-fra.com

Laravel 5: Récupérer un tableau JSON à partir de $ request

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?

19
Adam

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());
26
Hieu Le
 $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.

18
Glenn Plas

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);
3
Yun CHEN

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.

0
Loren