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查找第k小元素代码分享
Dec 18 Python
Python接收Gmail新邮件并发送到gtalk的方法
Mar 10 Python
Python实现Tab自动补全和历史命令管理的方法
Mar 12 Python
Django 添加静态文件的两种实现方法(必看篇)
Jul 14 Python
python中的迭代和可迭代对象代码示例
Dec 27 Python
pandas pivot_table() 按日期分多列数据的方法
Nov 16 Python
Python实现的矩阵转置与矩阵相乘运算示例
Mar 26 Python
python+Django实现防止SQL注入的办法
Oct 31 Python
python实现把两个二维array叠加成三维array示例
Nov 29 Python
Python实现对adb命令封装
Mar 06 Python
python基于爬虫+django,打造个性化API接口
Jan 21 Python
教你使用pyinstaller打包Python教程
May 27 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和ACCESS写聊天室(九)
2006/10/09 PHP
php基于base64解码图片与加密图片还原实例
2014/11/03 PHP
php实现paypal 授权登录
2015/05/28 PHP
PHP7.1实现的AES与RSA加密操作示例
2018/06/15 PHP
关于JavaScript的with 语句的使用方法
2011/05/09 Javascript
一行代码实现纯数据json对象的深度克隆实现思路
2013/01/09 Javascript
javascripit实现密码强度检测代码分享
2013/12/12 Javascript
详解JavaScript中的异常处理方法
2015/06/16 Javascript
js下将金额数字每三位一逗号分隔
2016/02/19 Javascript
AngularJs Scope详解及示例代码
2016/09/01 Javascript
jQuery实现鼠标经过时高亮,同时其他同级元素变暗的效果
2016/09/18 Javascript
基于JavaScript实现窗口拖动效果
2017/01/18 Javascript
jQuery在header中设置请求信息的方法
2017/03/06 Javascript
socket.io学习教程之基础介绍(一)
2017/04/29 Javascript
bootstrap table表格客户端分页实例
2017/08/07 Javascript
elementui的默认样式修改方法
2018/02/23 Javascript
js实现点击按钮复制文本功能
2020/07/20 Javascript
最后说说Vue2 SSR 的 Cookies 问题
2018/05/25 Javascript
原生JS封装_new函数实现new关键字的功能
2018/08/12 Javascript
js实现小球在页面规定的区域运动
2020/06/16 Javascript
python正则表达式判断字符串是否是全部小写示例
2013/12/25 Python
python中requests库session对象的妙用详解
2017/10/30 Python
解决phantomjs截图失败,phantom.exit位置的问题
2018/05/17 Python
python 如何将数据写入本地txt文本文件的实现方法
2019/09/11 Python
Python绘图实现显示中文
2019/12/04 Python
详解python中各种文件打开模式
2020/01/19 Python
详解CSS的border边框属性及其在CSS3中的新特性
2016/05/10 HTML / CSS
Top Villas美国:豪华别墅出租和度假屋
2018/07/10 全球购物
澳大利亚女装精品店:Alannah Hill
2020/07/29 全球购物
德国亚马逊官方网站:Amazon.de
2020/11/15 全球购物
静态成员和非静态成员的区别
2012/05/12 面试题
大学毕业生文采飞扬的自我鉴定
2013/12/03 职场文书
低碳生活的宣传标语
2014/06/23 职场文书
Golang 空map和未初始化map的注意事项说明
2021/04/29 Golang
浅谈如何保证Mysql主从一致
2022/03/13 MySQL
mysql的单列多值存储实例详解
2022/04/05 MySQL