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登陆asp网站页面的实现代码
Jan 14 Python
python通过pil模块将raw图片转换成png图片的方法
Mar 16 Python
Python配置mysql的教程(推荐)
Oct 13 Python
django在接受post请求时显示403forbidden实例解析
Jan 25 Python
python实现朴素贝叶斯分类器
Mar 28 Python
python 爬虫一键爬取 淘宝天猫宝贝页面主图颜色图和详情图的教程
May 22 Python
Python3中内置类型bytes和str用法及byte和string之间各种编码转换 问题
Sep 27 Python
Python参数类型以及常见的坑详解
Jul 08 Python
python实现的生成word文档功能示例
Aug 23 Python
Python plt 利用subplot 实现在一张画布同时画多张图
Feb 26 Python
Python音乐爬虫完美绕过反爬
Aug 30 Python
python中取整数的几种方法
Nov 07 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 xml常用函数的集合(比较详细)
2013/06/06 PHP
laravel数据库查询结果自动转数组修改实例
2021/02/27 PHP
Jqyery中同等与js中windows.onload的应用
2011/05/10 Javascript
Jquery 数组操作大全个人总结
2013/11/13 Javascript
使用jquery实现IE下按backspace相当于返回操作
2014/03/18 Javascript
js的参数有长度限制吗?发现不能超过2083个字符
2014/04/20 Javascript
jquery中的ajax方法怎样通过JSONP进行远程调用
2014/05/04 Javascript
JavaScript中对象property的删除方法介绍
2014/12/30 Javascript
JavaScript基础知识之方法汇总结
2016/01/24 Javascript
把普通对象转换成json格式的对象的简单实例
2016/07/04 Javascript
Vue.js每天必学之过滤器与自定义过滤器
2016/09/07 Javascript
javascript使用 concat 方法对数组进行合并的方法
2016/09/08 Javascript
浅谈vue的iview列表table render函数设置DOM属性值的方法
2017/09/30 Javascript
微信小程序实现人脸检测功能
2018/05/25 Javascript
解决mpvue + vuex 开发微信小程序vuex辅助函数mapState、mapGetters不可用问题
2018/08/03 Javascript
nodejs微信开发之授权登录+获取用户信息
2019/03/17 NodeJs
3分钟读懂移动端rem使用方法(推荐)
2019/05/06 Javascript
[02:52]2017DOTA2国际邀请赛中国区预选赛晋级之路
2017/07/03 DOTA
详细解析Python当中的数据类型和变量
2015/04/25 Python
Python中的with...as用法介绍
2015/05/28 Python
使用pandas中的DataFrame数据绘制柱状图的方法
2018/04/10 Python
python函数的作用域及关键字详解
2019/08/20 Python
自定义Django Form中choicefield下拉菜单选取数据库内容实例
2020/03/13 Python
解决pymysql cursor.fetchall() 获取不到数据的问题
2020/05/15 Python
解决Django响应JsonResponse返回json格式数据报错问题
2020/08/09 Python
解决PyCharm无法使用lxml库的问题(图解)
2020/12/22 Python
Python爬虫获取op.gg英雄联盟英雄对位胜率的源码
2021/01/29 Python
css3 transform过渡抖动问题解决
2020/10/23 HTML / CSS
香港万宁官方海外旗舰店:香港健与美连锁店
2018/09/27 全球购物
康拓普公司Java笔面试
2016/09/23 面试题
如何在Shell脚本中使用函数
2015/09/06 面试题
复核员上岗演讲稿
2014/01/05 职场文书
质量承诺书怎么写
2014/05/24 职场文书
运动会方队口号
2014/06/07 职场文书
教师年度个人总结
2015/02/11 职场文书
教师考核鉴定意见
2015/06/05 职场文书