Laravel 5: Retrieve JSON array from $request

Laravel 5

Laravel 5 Problem Overview


I'm a Laravel newbie and I'm converting a php/jquery app to Laravel. The original code used a JSON array with an ajax POST, which was retrieved like this:

$json = file_get_contents('php://input');
$data = json_decode($json,true);

I'm doing much the same thing on the POST side, but I don't see any data coming through in my Laravel $request collection. Is there something special that I need to do to retrieve JSON data structured like this:

[    { "name": "John", "location": "Boston" },     { "name": "Dave", "location": "Lancaster" }]

Here is my jQuery ajax POST code (with hard coded data)

$.ajax({
	type: "POST",
	url: "/people",
	data: '[{ "name": "John", "location": "Boston" }, { "name": "Dave", "location": "Lancaster" }]',
	dataType: "json",
	success:function(data) {
		$('#save_message').html(data.message);
	} 
});

Here is the code in my Controller that receives the POST

public function store(Request $request)
{
    dd($request->all());
}

But all I get is:

> []

Any ideas on how I can retreive my data?

Laravel 5 Solutions


Solution 1 - Laravel 5

You need to change your Ajax call to

$.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);
    } 
});

change the dataType to contentType and add the processData option.

To retrieve the JSON payload from your controller, use:

dd(json_decode($request->getContent(), true));

instead of

dd($request->all());

Solution 2 - Laravel 5

 $postbody='';
 // Check for presence of a body in the request
 if (count($request->json()->all())) {
     $postbody = $request->json()->all();
 }

This is how it's done in laravel 5.2 now.

Solution 3 - Laravel 5

Just a mention with jQuery v3.2.1 and Laravel 5.6.

Case 1: The JS object posted directly, like:

$.post("url", {name:'John'}, function( data ) {
});

Corresponding Laravel PHP code should be:

parse_str($request->getContent(),$data); //JSON will be parsed to object $data

Case 2: The JSON string posted, like:

$.post("url", JSON.stringify({name:'John'}), function( data ) {
});

Corresponding Laravel PHP code should be:

$data = json_decode($request->getContent(), true);

Solution 4 - Laravel 5

You can use getContent() method on Request object.

$request->getContent() //json as a string.

Solution 5 - Laravel 5

As of Laravel 5.2+, you can fetch it directly with $request->input('item') as well.

> # Retrieving JSON Input Values > > When sending JSON requests to your application, you may access the > JSON data via the input method as long as the Content-Type header of > the request is properly set to application/json. You may even use > "dot" syntax to dig deeper into JSON arrays: > > $name = $request->input('user.name');

https://laravel.com/docs/5.2/requests

As noted above, the content-type header must be set to application/json so the jQuery ajax call would need to include 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);
    } 
});

By fixing the AJAX call, $request->all() should work.

Solution 6 - Laravel 5

My jQuery ajax settings:

        $.ajax({
        headers: {'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')},
        url: url,
        dataType: "json",
        type: "post",
        data: params,
        success: function (resp){
            ....
        },
        error: responseFunc
    });

And now i am able to get the request via $request->all() in Laravel

dataType: "json"

is the important part in the ajax request to handle the response as an json object and not string.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionAdamView Question on Stackoverflow
Solution 1 - Laravel 5Hieu LeView Answer on Stackoverflow
Solution 2 - Laravel 5Glenn PlasView Answer on Stackoverflow
Solution 3 - Laravel 5Yun CHENView Answer on Stackoverflow
Solution 4 - Laravel 5Santosh AchariView Answer on Stackoverflow
Solution 5 - Laravel 5LorenView Answer on Stackoverflow
Solution 6 - Laravel 5Mike AronView Answer on Stackoverflow