Laravel 5: получить массив JSON из запроса $

Я новичок в Laravel, и я конвертирую приложение php/jquery в Laravel. В исходном коде использовался массив JSON с ajax POST, который был получен следующим образом:

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

Я делаю то же самое на стороне POST, но не вижу никаких данных в моей коллекции запросов Laravel $. Есть ли что-то особенное, что мне нужно сделать, чтобы получить данные JSON, структурированные следующим образом:

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

Вот мой jQuery ajax POST-код (с жестко закодированными данными)

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

Вот код в моем контроллере, который получает POST

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

Но все, что я получаю, это:

[]

Любые идеи о том, как я могу восстановить мои данные?

Ответ 1

Вам нужно изменить свой вызов Ajax на

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

измените значение dataType на contentType и добавьте параметр processData.

Чтобы получить полезную нагрузку JSON с вашего контроллера, используйте:

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

вместо

dd($request->all());

Ответ 2

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

Вот как это делается в laravel 5.2 сейчас.

Ответ 3

Просто упоминание с jQuery v3.2.1 и Laravel 5.6.

Случай 1: объект JS размещен напрямую, например:

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

Соответствующий код Laravel PHP должен быть:

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

Случай 2: отправленная строка JSON, например:

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

Соответствующий код Laravel PHP должен быть:

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

Ответ 4

Начиная с Laravel 5. 2+, вы также можете получить его напрямую с помощью $request->input('item').

Получение входных значений JSON

При отправке запросов JSON вашему приложению вы можете получить доступ к данным JSON с помощью метода ввода, если заголовок Content-Type запроса правильно установлен на application/json. Вы можете даже использовать синтаксис "точка", чтобы глубже копаться в массивах JSON:

$ name = $request-> input ('user.name');

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

Как отмечалось выше, заголовок типа контента должен быть установлен на application/json поэтому вызов contentType: "application/json", jQuery должен включать 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);
    } 
});

$request->all() вызов AJAX, $request->all() должно работать.