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获取标准北京时间的方法
Mar 24 Python
使用C语言扩展Python程序的简单入门指引
Apr 14 Python
python3安装pip3(install pip3 for python 3.x)
Apr 03 Python
Python中的二维数组实例(list与numpy.array)
Apr 13 Python
Python测试网络连通性示例【基于ping】
Aug 03 Python
pycharm 实现显示project 选项卡的方法
Jan 17 Python
详解python statistics模块及函数用法
Oct 27 Python
Python xlrd模块导入过程及常用操作
Jun 10 Python
Python应用实现处理excel数据过程解析
Jun 19 Python
Python获取浏览器窗口句柄过程解析
Jul 25 Python
通过实例简单了解python yield使用方法
Aug 06 Python
python爬取豆瓣电影排行榜(requests)的示例代码
Feb 18 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
PHP获取表单textarea数据中的换行问题
2010/09/10 PHP
高性能PHP框架Symfony2经典入门教程
2014/07/08 PHP
PHP实现克鲁斯卡尔算法实例解析
2014/08/22 PHP
PHP5全版本绕过open_basedir读文件脚本漏洞详细介绍
2015/01/20 PHP
使用php-timeit估计php函数的执行时间
2015/09/06 PHP
Yii2创建多界面主题(Theme)的方法
2016/10/08 PHP
php中序列化与反序列化详解
2017/02/13 PHP
PHP实现二维数组中的查找算法小结
2018/06/09 PHP
url 编码 js url传参中文乱码解决方案
2010/04/11 Javascript
自己做的模拟模态对话框实现代码
2012/05/23 Javascript
js下拉菜单语言选项简单实现
2013/09/23 Javascript
学习vue.js计算属性
2016/12/03 Javascript
基于bootstrap实现多个下拉框同时搜索功能
2017/07/19 Javascript
vue-router+vuex addRoutes实现路由动态加载及菜单动态加载
2017/09/28 Javascript
微信小程序支付之c#后台实现方法
2017/10/19 Javascript
利用vue开发一个所谓的数独方法实例
2017/12/21 Javascript
Vue入门之数据绑定(小结)
2018/01/08 Javascript
angularjs select 赋值 ng-options配置方法
2018/02/28 Javascript
JavaScript对象拷贝与赋值操作实例分析
2018/12/10 Javascript
vue实现权限控制路由(vue-router 动态添加路由)
2019/11/04 Javascript
node.js事件轮询机制原理知识点
2019/12/22 Javascript
[02:07]2018DOTA2亚洲邀请赛主赛事第三日五佳镜头 fy极限反杀
2018/04/06 DOTA
[49:12]完美世界DOTA2联赛PWL S2 Magma vs GXR 第二场 11.29
2020/12/02 DOTA
python模拟enum枚举类型的方法小结
2015/04/30 Python
Python中在for循环中嵌套使用if和else语句的技巧
2016/06/20 Python
Django日志模块logging的配置详解
2017/02/14 Python
python添加模块搜索路径方法
2017/09/11 Python
python和flask中返回JSON数据的方法
2018/03/26 Python
python获取代码运行时间的实例代码
2018/06/11 Python
python学习开发mock接口
2019/04/28 Python
python调试神器PySnooper的使用
2019/07/03 Python
用css3实现转换过渡和动画效果
2020/03/13 HTML / CSS
企业管理毕业生求职信范文
2014/03/07 职场文书
文明单位汇报材料
2014/12/24 职场文书
2015年秋季小学开学典礼主持词
2015/07/16 职场文书
nginx代理实现静态资源访问的示例代码
2022/07/07 Servers