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实现代理服务功能实例
Nov 15 Python
Python批量修改文件后缀的方法
Jan 26 Python
Python实现各种排序算法的代码示例总结
Dec 11 Python
Python-嵌套列表list的全面解析
Jun 08 Python
快速了解python leveldb
Jan 18 Python
Django中间件实现拦截器的方法
Jun 01 Python
django.db.utils.ProgrammingError: (1146, u“Table‘’ doesn’t exist”)问题的解决
Jul 13 Python
Python使用random.shuffle()打乱列表顺序的方法
Nov 08 Python
python循环定时中断执行某一段程序的实例
Jun 29 Python
关于Python字符串显示u...的解决方式
Mar 06 Python
Python小整数对象池和字符串intern实例解析
Mar 21 Python
Python 在局部变量域中执行代码
Aug 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
NO3第三帝国留言簿制作过程
2006/10/09 PHP
探讨:如何通过stats命令分析Memcached的内部状态
2013/06/14 PHP
解析如何在PHP下载文件名中解决乱码的问题
2013/06/20 PHP
PHP使用Redis替代文件存储Session的方法
2017/02/15 PHP
总结PHP代码规范、流程规范、git规范
2018/06/18 PHP
PDO::quote讲解
2019/01/29 PHP
脚本之家贴图转换+转贴工具用到的js代码超级推荐
2007/04/05 Javascript
ie 调试javascript的工具
2009/04/29 Javascript
javascript面向对象之Javascript 继承
2010/05/04 Javascript
jQuery实现悬浮在右上角的网页客服效果代码
2015/10/24 Javascript
在一个页面实现两个zTree联动的方法
2017/12/20 Javascript
Vue框架里使用Swiper的方法示例
2018/09/20 Javascript
通过JQuery,JQueryUI和Jsplumb实现拖拽模块
2019/06/18 jQuery
ES6 Map结构的应用实例分析
2019/06/26 Javascript
vue实现滑动到底部加载更多效果
2020/10/27 Javascript
Node.js fs模块原理及常见用途
2020/10/22 Javascript
Js利用正则表达式去除字符串的中括号
2020/11/23 Javascript
vuex页面刷新导致数据丢失的解决方案
2020/12/10 Vue.js
[02:05]2014DOTA2国际邀请赛 BBC外卡赛赛后总结
2014/07/09 DOTA
[47:04]LGD vs infamous Supermajor小组赛D组 BO3 第二场 6.3
2018/06/04 DOTA
讲解Python的Scrapy爬虫框架使用代理进行采集的方法
2016/02/18 Python
python进阶_浅谈面向对象进阶
2017/08/17 Python
Python实现的求解最大公约数算法示例
2018/05/03 Python
浅谈numpy生成数组的零值问题
2018/11/12 Python
python多线程抽象编程模型详解
2019/03/20 Python
django用户登录验证的完整示例代码
2019/07/21 Python
python实现操作文件(文件夹)
2019/10/31 Python
Python常用编译器原理及特点解析
2020/03/23 Python
localstorage和sessionstorage使用记录(推荐)
2017/05/23 HTML / CSS
机电专业求职信
2014/06/14 职场文书
计算机多媒体专业自荐信
2014/07/04 职场文书
对外汉语专业大学生职业生涯规划书
2014/10/11 职场文书
离婚答辩状范文
2015/05/22 职场文书
详解分布式系统中如何用python实现Paxos
2021/05/18 Python
解决tk mapper 通用mapper的bug问题
2021/06/16 Java/Android
python3实现常见的排序算法(示例代码)
2021/07/04 Python