Laravel 5:从 $request 中检索 JSON 数组

Posted

技术标签:

【中文标题】Laravel 5:从 $request 中检索 JSON 数组【英文标题】:Laravel 5: Retrieve JSON array from $request 【发布时间】:2016-01-05 11:41:04 【问题描述】:

我是 Laravel 新手,我正在将一个 php/jquery 应用程序转换为 Laravel。原始代码使用带有 ajax POST 的 JSON 数组,检索方式如下:

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

我在 POST 方面做了很多相同的事情,但我没有看到我的 Laravel $request 集合中有任何数据通过。我需要做一些特别的事情来检索结构如下的 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】:

我的 jQuery ajax 设置:

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

现在我可以通过 Laravel 中的 $request->all() 获取请求

dataType: "json"

是ajax请求中将响应作为json对象而不是字符串处理的重要部分。

【讨论】:

【参考方案2】:

您可以在 Request 对象上使用 getContent() 方法。

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

【讨论】:

答案应该总是带有一些解释【参考方案3】:

从 Laravel 5.2+ 开始,您也可以使用 $request->input('item') 直接获取它。

检索 JSON 输入值

向您的应用程序发送 JSON 请求时,您可以访问 JSON数据只要通过输入法的Content-Type header 请求已正确设置为 application/json。你甚至可以使用 “点”语法深入挖掘 JSON 数组:

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

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

如上所述,内容类型标头必须设置为 application/json,因此 jQuery ajax 调用需要包含 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);
     
);

通过修复 AJAX 调用,$request->all() 应该可以工作了。

【讨论】:

那我如何在$request->all()之后解析"name" and "location"【参考方案4】:

仅提及 jQuery v3.2.1 和 Laravel 5.6。

案例一:直接发布的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);

【讨论】:

如何在php控制器中解析name:'John'的名字? $data->name ? true 在这里做什么?我无法从 json_decode 的文档中弄清楚。【参考方案5】:
 $postbody='';
 // Check for presence of a body in the request
 if (count($request->json()->all())) 
     $postbody = $request->json()->all();
 

这就是现在在 laravel 5.2 中的做法。

【讨论】:

非常感谢 :),我试图将它与 JS fetch API 一起使用【参考方案6】:

您需要将 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());

【讨论】:

遗憾的是,我的 Laravel 控制器中仍然没有任何数据 - 只是 []。但是我可以看到标题从 Form Data 变为 Request Payload 我已经更新了我的回复,您也需要更改在控制器中获取输入的方式。

以上是关于Laravel 5:从 $request 中检索 JSON 数组的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 laravel 检索 GET 参数

从函数中检索 JSON 和 PHP 值

laravel 5 简单的 ajax 从数据库中检索记录

Laravel 5.4:无法从关系中检索数据

Vue 2 Laravel 5.3 Eloquent 无法从对象中检索数据

Laravel 5.7 - 如何使用 axios.get 从 API 检索数据?