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 数组的主要内容,如果未能解决你的问题,请参考以下文章