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 12 Python
在python的WEB框架Flask中使用多个配置文件的解决方法
Apr 18 Python
python通过wxPython打开一个音频文件并播放的方法
Mar 25 Python
利用numpy+matplotlib绘图的基本操作教程
May 03 Python
python jieba分词并统计词频后输出结果到Excel和txt文档方法
Feb 11 Python
Sanic框架配置操作分析
Jul 17 Python
python bmp转换为jpg 并删除原图的方法
Oct 25 Python
Windows下Python3.6安装第三方模块的方法
Nov 22 Python
Python从数据库读取大量数据批量写入文件的方法
Dec 10 Python
对Python生成汉字字库文字,以及转换为文字图片的实例详解
Jan 29 Python
Python通过VGG16模型实现图像风格转换操作详解
Jan 16 Python
python数字图像处理:图像简单滤波
Jun 28 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+dojo 的数据库保存拖动布局的一个方法dojo 这里下载
2007/03/07 PHP
php上传文件的增强函数
2010/07/21 PHP
php四种基础算法代码实例
2013/10/29 PHP
php批量删除超链接的实现方法
2015/10/19 PHP
Jquery实现鼠标移动放大图片功能实例
2015/03/25 Javascript
jQuery+JSON实现AJAX二级联动实例分析
2015/12/18 Javascript
jQuery验证插件validate使用详解
2016/05/11 Javascript
基于jquery插件实现拖拽删除图片功能
2020/08/27 Javascript
Js获取图片原始宽高的实现代码
2016/05/17 Javascript
JavaScript的instanceof运算符学习教程
2016/06/08 Javascript
JS转换HTML转义符的方法
2016/08/24 Javascript
[原创]SyntaxHighlighter自动识别并加载脚本语言
2017/02/07 Javascript
Vue指令的钩子函数使用方法
2017/03/20 Javascript
深入理解Node module模块
2018/03/26 Javascript
详解Vue的钩子函数(路由导航守卫、keep-alive、生命周期钩子)
2018/07/24 Javascript
vue 利用路由守卫判断是否登录的方法
2018/09/29 Javascript
新手快速上手webpack4打包工具的使用详解
2019/01/28 Javascript
vue动态绑定class的几种常用方式小结
2019/05/21 Javascript
微信小程序3D轮播实现代码
2019/09/19 Javascript
js节流防抖应用场景,以及在vue中节流防抖的具体实现操作
2020/09/21 Javascript
[04:48]DOTA2亚洲邀请赛林书豪为VGJ加油
2017/04/01 DOTA
教你安装python Django(图文)
2013/11/04 Python
python中reduce()函数的使用方法示例
2017/09/29 Python
python opencv实现运动检测
2018/07/10 Python
Pandas中DataFrame的分组/分割/合并的实现
2019/07/16 Python
Django框架基础模板标签与filter使用方法详解
2019/07/23 Python
python单例模式的多种实现方法
2019/07/26 Python
Python队列RabbitMQ 使用方法实例记录
2019/08/05 Python
Python 类的私有属性和私有方法实例分析
2019/09/29 Python
python实现将json多行数据传入到mysql中使用
2019/12/31 Python
在tensorflow中实现屏蔽输出的log信息
2020/02/04 Python
pytorch 常用函数 max ,eq说明
2020/06/28 Python
详解HTML5 录音的踩坑之旅
2017/12/26 HTML / CSS
菲律宾旅游网站:Expedia菲律宾
2017/10/11 全球购物
停车场管理制度范本
2015/08/05 职场文书
大学学生会主席竞选稿
2015/11/19 职场文书