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实现人人网登录示例分享
Jan 19 Python
线程和进程的区别及Python代码实例
Feb 04 Python
Django进阶之CSRF的解决
Aug 01 Python
Python设计模式之简单工厂模式实例详解
Jan 22 Python
Python查找最长不包含重复字符的子字符串算法示例
Feb 13 Python
使用python制作一个为hex文件增加版本号的脚本实例
Jun 12 Python
Python3 itchat实现微信定时发送群消息的实例代码
Jul 12 Python
基于python3 pyQt5 QtDesignner实现窗口化猜数字游戏功能
Jul 15 Python
一行Python代码制作动态二维码的实现
Sep 09 Python
Python爬取豆瓣视频信息代码实例
Nov 16 Python
基于python实现可视化生成二维码工具
Jul 08 Python
分享7个 Python 实战项目练习
Mar 03 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
检测png图片是否完整的php代码
2010/09/06 PHP
twig里使用js变量的方法
2016/02/05 PHP
详解Yaf框架PHPUnit集成测试方法
2017/12/27 PHP
PHP区块查询实现方法分析
2018/05/12 PHP
TP5框架实现的数据库备份功能示例
2020/04/05 PHP
Nigma vs Liquid BO3 第二场2.14
2021/03/10 DOTA
跟随鼠标旋转的文字
2006/11/30 Javascript
兼容ie和firefox js关闭代码
2008/12/11 Javascript
js 将json字符串转换为json对象的方法解析
2013/11/13 Javascript
利用jQuery实现可以编辑的表格
2014/05/26 Javascript
JavaScript使用focus()设置焦点失败的解决方法
2014/09/03 Javascript
node.js中的emitter.on方法使用说明
2014/12/10 Javascript
Windows系统下Node.js的简单入门教程
2015/06/23 Javascript
js简单工厂模式用法实例
2015/06/30 Javascript
jquery获得当前html页面源码的方法
2015/07/14 Javascript
jQuery获取复选框选中的当前行的某个字段的值
2017/09/15 jQuery
JS Generator 函数的含义与用法实例总结
2020/04/08 Javascript
[54:05]DOTA2-DPC中国联赛定级赛 SAG vs iG BO3第一场 1月9日
2021/03/11 DOTA
python实现堆和索引堆的代码示例
2018/03/19 Python
pymongo中聚合查询的使用方法
2019/03/22 Python
python matplotlib库绘制条形图练习题
2019/08/10 Python
python实现一个点绕另一个点旋转后的坐标
2019/12/04 Python
python统计文章中单词出现次数实例
2020/02/27 Python
Python3实现打印任意宽度的菱形代码
2020/04/12 Python
Python requests模块安装及使用教程图解
2020/06/30 Python
Python 如何定义匿名或内联函数
2020/08/01 Python
requests在python中发送请求的实例讲解
2021/02/17 Python
Html5 postMessage实现跨域消息传递
2016/03/11 HTML / CSS
Haggar官网:美国男装品牌
2020/02/16 全球购物
C#笔试题
2015/07/14 面试题
银行存款证明样本
2014/01/17 职场文书
婚礼主持结束词
2014/03/13 职场文书
项目合作协议书
2014/04/16 职场文书
2014年公务员退休工资改革方案
2014/10/01 职场文书
《田忌赛马》教学反思
2016/02/19 职场文书
Python包argparse模块常用方法
2021/06/04 Python