PHP实现发送和接收JSON请求


Posted in Python onJune 07, 2018

现在微服务中,很多API由于需要传递的参数较多所以要求用包含所有参数的JSON数据作为POST请求的请求体来替代FormData传递参数的方式,在参数量较多时POST JSON要比POST FormData便于开发和测试,今天我们就来看一下在PHP中如何发送和接受JOSN POST,以及在Laravel框架中针对JSON Request提供的访问JSON请求数据的便捷方法。

PHP发送JSON POST

$url = "http://example.com/request/post/json"; 
$data = json_encode(["foo" => "bar"]);
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HTTPHEADER, array("Content-type: application/json"));
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
curl_exec($curl);
curl_close($curl);

PHP接受JSON POST

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

$HTTP_RAW_POST_DATA](http://php.net/manual/zh/reserved.variables.httprawpostdata.php),因为它不依赖于特定的 php.ini 指令。 而且,这样的情况下 [$HTTP_RAW_POST_DATA 默认没有填充, 比激活 always_populate_raw_post_data 潜在需要更少的内存。 enctype="multipart/form-data" 的时候 php://input 是无效的。

Note: 在 PHP 5.6 之前 php://input 打开的数据流只能读取一次; 数据流不支持 seek 操作。 不过,依赖于 SAPI 的实现,请求体数据被保存的时候, 它可以打开另一个 php://input 数据流并重新读取。 通常情况下,这种情况只是针对 POST 请求,而不是其他请求方式,比如 PUT 或者 PROPFIND。

使用Guzzle发送JSON请求

很多时候在开发中我们并不会像上面那样用php curl库来发送请求而是使用开源的Http包,常用的Http package比如 Guzzle都有为发送JSON请求提供了便捷的方法。

//Guzzle version >= 5
use GuzzleHttp\Client;

$client = new Client();

$response = $client->post('url', [
 GuzzleHttp\RequestOptions::JSON => ['foo' => 'bar']
]);

Laravel中接受JSON POST

使用Request的json()->all()获取请求体里的整个JSON

//IN controller
public function recieveJson(Request $request)
{
 $request->json()->all();
 //返回值是一个数组
 //针对前面的请求例子,json方法返回的是数组 ["foo" => "bar"]
 //$request->json()返回的是ParamBage
}

使用Request的input方法获取请求中的整个JSON或者具体key的值

发送 JSON 请求到Laravel应用的时候,只要 Content-Type 请求头被设置为 application/json,都可以通过 input 方法获取 JSON 数据,还可以通过“.”号解析数组:

public function laravelRecieveJson(Reuqest $request)
{
  $foo = $request->input('foo');//echo $foo => 'bar'
  //使用点号获取内嵌数组key的值
  //假设请求体中的JSON为 {"user": {"name": "kevin", "age": 18}}
  $name = $reqeust->input('user.name');//echo $name => 'kevin'
}
Python 相关文章推荐
python命令行参数解析OptionParser类用法实例
Oct 09 Python
基于DataFrame筛选数据与loc的用法详解
May 18 Python
python实现遍历文件夹修改文件后缀
Aug 28 Python
详解Python sys.argv使用方法
May 10 Python
使用python分析统计自己微信朋友的信息
Jul 19 Python
详细介绍Python进度条tqdm的使用
Jul 31 Python
python读取raw binary图片并提取统计信息的实例
Jan 09 Python
python实现梯度下降法
Mar 24 Python
pyqt5中动画的使用详解
Apr 01 Python
什么是Python变量作用域
Jun 03 Python
如何基于matlab相机标定导出xml文件
Nov 02 Python
python入门之算法学习
Apr 22 Python
使用python画个小猪佩奇的示例代码
Jun 06 #Python
python re模块的高级用法详解
Jun 06 #Python
Python实现的爬取网易动态评论操作示例
Jun 06 #Python
Python3实现的爬虫爬取数据并存入mysql数据库操作示例
Jun 06 #Python
利用python如何处理百万条数据(适用java新手)
Jun 06 #Python
Python3实现的Mysql数据库操作封装类
Jun 06 #Python
python操作redis方法总结
Jun 06 #Python
You might like
网络资源
2006/10/09 PHP
用php实现像JSP,ASP里Application那样的全局变量
2007/01/12 PHP
PHP使用CURL模拟登录的方法
2015/07/08 PHP
PHP实现文件上传操作和封装
2020/03/04 PHP
jQuery 连续列表实现代码
2009/12/21 Javascript
jQuery实现点击标题输入详细信息
2013/04/16 Javascript
jquery选择器之属性过滤选择器详解
2014/01/27 Javascript
JavaScript实现计算字符串中出现次数最多的字符和出现的次数
2015/03/12 Javascript
JavaScript Math.round() 方法
2015/12/18 Javascript
jQuery Form 表单提交插件之formSerialize,fieldSerialize,fieldValue,resetForm,clearForm,clearFields的应用
2016/01/23 Javascript
JavaScript中三个等号和两个等号的区别(== 和 ===)浅析
2016/09/22 Javascript
提升页面加载速度的插件InstantClick
2017/09/12 Javascript
详解Vue 事件修饰符capture 的使用
2017/12/29 Javascript
jquery获取file表单选择文件的路径、名字、大小、类型
2019/01/18 jQuery
解决Vue的项目使用Element ui 走马灯无法实现的问题
2020/08/03 Javascript
[02:28]DOTA2 2015国际邀请赛中国区预选赛首日现场百态
2015/05/26 DOTA
浅析Python中MySQLdb的事务处理功能
2016/09/21 Python
python、java等哪一门编程语言适合人工智能?
2017/11/13 Python
numpy 进行数组拼接,分别在行和列上合并的实例
2018/05/08 Python
python抓取搜狗微信公众号文章
2019/04/01 Python
Python统计时间内的并发数代码实例
2019/12/28 Python
From CSV to SQLite3 by python 导入csv到sqlite实例
2020/02/14 Python
PIL包中Image模块的convert()函数的具体使用
2020/02/26 Python
从Pytorch模型pth文件中读取参数成numpy矩阵的操作
2021/03/04 Python
不可轻视HTML5!App三年内将被html5顶替彻底消失
2015/11/18 HTML / CSS
总经理秘书的岗位职责
2013/12/27 职场文书
大学生毕业自我鉴定范文
2014/02/03 职场文书
英语自我介绍演讲稿
2014/09/01 职场文书
秋季运动会广播稿(30篇)
2014/09/13 职场文书
2014年团员学习十八大思想汇报
2014/09/13 职场文书
明确岗位职责
2015/02/14 职场文书
语文教师求职信范文
2015/03/20 职场文书
证券区域经理岗位职责
2015/04/10 职场文书
生产车间管理制度
2015/08/04 职场文书
祝福语集锦:给满月宝宝的祝福语
2019/11/20 职场文书
Python基础之赋值,浅拷贝,深拷贝的区别
2021/04/30 Python