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 输出一个两行字符的变量
Feb 05 Python
用Python和MD5实现网站挂马检测程序
Mar 13 Python
用Python输出一个杨辉三角的例子
Jun 13 Python
详解Python的迭代器、生成器以及相关的itertools包
Apr 02 Python
python实现下载整个ftp目录的方法
Jan 17 Python
python读取txt文件,去掉空格计算每行长度的方法
Dec 20 Python
Python实现二叉树的最小深度的两种方法
Sep 30 Python
复化梯形求积分实例——用Python进行数值计算
Nov 20 Python
浅析PyCharm 的初始设置(知道)
Oct 12 Python
Python基于template实现字符串替换
Nov 27 Python
详解matplotlib中pyplot和面向对象两种绘图模式之间的关系
Jan 22 Python
python 实现体质指数BMI计算
May 26 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
CI框架学习笔记(一) - 环境安装、基本术语和框架流程
2014/10/26 PHP
php堆排序实现原理与应用方法
2015/01/03 PHP
解决nginx不支持thinkphp中pathinfo的问题
2015/07/21 PHP
Grid得到选择行数据的方法总结
2011/01/17 Javascript
JavaScript中的全局对象介绍
2015/01/01 Javascript
JavaScript实现自动变换表格边框颜色
2015/05/08 Javascript
在Javascript中处理字符串之big()方法的使用
2015/06/08 Javascript
详解AngularJS中的表达式使用
2015/06/16 Javascript
JS实现适合于后台使用的动画折叠菜单效果
2015/09/21 Javascript
javascript给span标签赋值的方法
2015/11/26 Javascript
关于vue.js弹窗组件的知识点总结
2016/09/11 Javascript
JS脚本实现网页自动秒杀点击
2018/01/11 Javascript
使用Vue开发动态刷新Echarts组件的教程详解
2018/03/22 Javascript
vue 解决遍历对象显示的顺序不对问题
2019/11/07 Javascript
0基础学习前端开发的一些建议
2020/07/14 Javascript
Python解析网页源代码中的115网盘链接实例
2014/09/30 Python
python中随机函数random用法实例
2015/04/30 Python
Python引用传值概念与用法实例小结
2017/10/07 Python
Python网络编程使用select实现socket全双工异步通信功能示例
2018/04/09 Python
Python 占位符的使用方法详解
2019/07/10 Python
python爬虫开发之Request模块从安装到详细使用方法与实例全解
2020/03/09 Python
python中wx模块的具体使用方法
2020/05/15 Python
Python监听键盘和鼠标事件的示例代码
2020/11/18 Python
python中函数返回多个结果的实例方法
2020/12/16 Python
python time.strptime格式化实例详解
2021/02/03 Python
Html5应用程序缓存(Cache manifest)
2018/06/04 HTML / CSS
迪斯尼商品官方网站:ShopDisney
2016/08/01 全球购物
实用求职信范文分享
2013/12/25 职场文书
护士检查书
2014/01/17 职场文书
《圆明园的毁灭》教学反思
2014/02/28 职场文书
班级寄语大全
2014/04/10 职场文书
第二课堂活动总结
2014/05/07 职场文书
做一个有道德的人活动实施方案
2014/08/23 职场文书
国际政治学专业推荐信
2014/09/26 职场文书
巴黎圣母院观后感
2015/06/10 职场文书
2019年“我为祖国点赞”演讲稿(3篇)
2019/09/26 职场文书