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当中的字符串和编码
Apr 25 Python
Python使用Scrapy爬取妹子图
May 28 Python
Python中扩展包的安装方法详解
Jun 14 Python
详解python eval函数的妙用
Nov 16 Python
在CentOS6上安装Python2.7的解决方法
Jan 09 Python
python实现对指定字符串补足固定长度倍数截断输出的方法
Nov 15 Python
python pyqtgraph 保存图片到本地的实例
Mar 14 Python
opencv+python实现鼠标点击图像,输出该点的RGB和HSV值
Jun 02 Python
Python实现LR1文法的完整实例代码
Oct 25 Python
Python3+Django get/post请求实现教程详解
Feb 16 Python
python在协程中增加任务实例操作
Feb 28 Python
python中的sys模块和os模块
Mar 20 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
使用数据库保存session的方法
2006/10/09 PHP
生成静态页面的PHP类
2006/11/25 PHP
php网页后退不再出现过期
2007/03/08 PHP
PHP获取163、gmail、126等邮箱联系人地址【已测试2009.10.10】
2009/10/11 PHP
php把session写入数据库示例
2014/02/26 PHP
php设计模式之建造器模式分析【星际争霸游戏案例】
2020/01/23 PHP
php 多进程编程父进程的阻塞与非阻塞实例分析
2020/02/22 PHP
分析 JavaScript 中令人困惑的变量赋值
2007/08/13 Javascript
JavaScript入门学习书籍推荐
2008/06/12 Javascript
jQuery解决iframe高度自适应代码
2009/12/20 Javascript
jQuery数组处理代码详解(含实例演示)
2012/02/03 Javascript
JS字符串处理实例代码
2013/08/05 Javascript
js实现a标签超链接提交form表单的方法
2015/06/24 Javascript
ztree获取选中节点时不能进入可视区域出现BUG如何解决
2015/12/03 Javascript
jquery实现表格中点击相应行变色功能效果【实例代码】
2016/05/09 Javascript
微信小程序点击控件修改样式实例详解
2017/07/07 Javascript
node.js事件轮询机制原理知识点
2019/12/22 Javascript
TypeScript之调用栈的实现
2019/12/31 Javascript
JS数组方法push()、pop()用法实例分析
2020/01/18 Javascript
Vue+Spring Boot简单用户登录(附Demo)
2020/11/12 Javascript
PyMongo安装使用笔记
2015/04/27 Python
python最长回文串算法
2018/06/04 Python
Python闭包执行时值的传递方式实例分析
2018/06/04 Python
Python 判断奇数偶数的方法
2018/12/20 Python
利用pandas合并多个excel的方法示例
2019/10/10 Python
python爬虫破解字体加密案例详解
2021/03/02 Python
AVON雅芳官网:世界上最大的美容化妆品公司之一
2016/11/02 全球购物
大学生职业规划前言模板
2013/12/27 职场文书
前台文员岗位职责
2013/12/28 职场文书
内蒙古鄂尔多斯市市长寄语
2014/04/10 职场文书
班级学习雷锋活动总结
2014/07/04 职场文书
2014年图书管理员工作总结
2014/12/01 职场文书
2014年党支部书记工作总结
2014/12/04 职场文书
巾帼标兵事迹材料
2014/12/26 职场文书
2015年党员创先争优承诺书
2015/01/22 职场文书
Python 中面向接口编程
2022/05/20 Python