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 18 Python
Python学习笔记之常用函数及说明
May 23 Python
记录Django开发心得
Jul 16 Python
Python使用urllib模块的urlopen超时问题解决方法
Nov 08 Python
在Python的框架中为MySQL实现restful接口的教程
Apr 08 Python
从Python的源码来解析Python下的freeblock
May 11 Python
Python中subprocess的简单使用示例
Jul 28 Python
在VS2017中用C#调用python脚本的实现
Jul 31 Python
pygame实现俄罗斯方块游戏(AI篇2)
Oct 29 Python
Python3 Tkinkter + SQLite实现登录和注册界面
Nov 19 Python
Python-jenkins 获取job构建信息方式
May 12 Python
TensorFlow保存TensorBoard图像操作
Jun 23 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+mysql写的简单留言本实例代码
2008/07/25 PHP
PHP设计模式 注册表模式
2012/02/05 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(六)
2014/06/23 PHP
javascript Firefox与IE 替换节点的方法
2010/02/24 Javascript
jquery mobile实现拨打电话功能的几种方法
2013/08/05 Javascript
jQuery插件jQuery-JSONP开发ajax调用使用注意事项
2013/11/22 Javascript
JS 屏蔽按键效果与改变按键效果的示例代码
2013/12/24 Javascript
jquery比较简洁的软键盘特效实现方法
2015/03/19 Javascript
详解页面滚动值scrollTop在FireFox与Chrome浏览器间的兼容问题
2015/12/03 Javascript
获取jqGrid中选择的行的数据
2016/11/30 Javascript
javascript cookie的基本操作(添加和删除)
2017/07/24 Javascript
jquery ajax异步提交表单数据的方法
2017/10/27 jQuery
JavaScript 中的 this 工作原理
2018/06/20 Javascript
vue+element-ui实现表格编辑的三种实现方式
2018/10/31 Javascript
webpack3升级到webpack4遇到问题总结
2019/09/30 Javascript
VUE实现图片验证码功能
2020/11/18 Javascript
解决React在安装antd之后出现的Can't resolve './locale'问题(推荐)
2020/05/03 Javascript
解决vue 使用setTimeout,离开当前路由setTimeout未销毁的问题
2020/07/21 Javascript
[01:07:13]TNC vs Pain 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
python下如何让web元素的生成更简单的分析
2008/07/17 Python
pygame学习笔记(4):声音控制
2015/04/15 Python
将Emacs打造成强大的Python代码编辑工具
2015/11/20 Python
基于Python的关键字监控及告警
2017/07/06 Python
Python编程scoketServer实现多线程同步实例代码
2018/01/29 Python
python numpy 一维数组转变为多维数组的实例
2018/07/02 Python
Python tkinter的grid布局及Text动态显示方法
2018/10/11 Python
使用python爬取抖音视频列表信息
2019/07/15 Python
keras中的backend.clip用法
2020/05/22 Python
解决keras backend 越跑越慢问题
2020/06/18 Python
python上selenium的弹框操作实现
2020/07/13 Python
用python写一个带有gui界面的密码生成器
2020/11/06 Python
标记环网Toke Ring IEEE802.5
2014/05/26 面试题
网游商务专员求职信
2013/10/15 职场文书
2015年财务试用期工作总结
2014/12/24 职场文书
react 路由Link配置详解
2021/11/11 Javascript
Win10 和 Win11可以共存吗? win10/11产品生命周期/服务更新介绍
2021/11/21 数码科技