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使用pandas处理CSV文件的实例讲解
Jun 22 Python
Python实现判断一个整数是否为回文数算法示例
Mar 02 Python
分享8点超级有用的Python编程建议(推荐)
Oct 13 Python
python3.8 微信发送服务器监控报警消息代码实现
Nov 05 Python
pytorch 实现模型不同层设置不同的学习率方式
Jan 06 Python
python批量修改xml属性的实现方式
Mar 05 Python
浅谈python多线程和多线程变量共享问题介绍
Apr 17 Python
解决Python spyder显示不全df列和行的问题
Apr 20 Python
关于django python manage.py startapp 应用名出错异常原因解析
Dec 15 Python
Pytest allure 命令行参数的使用
Apr 18 Python
Python爬虫:从m3u8文件里提取小视频的正确操作
May 14 Python
通过Python把学姐照片做成拼图游戏
Feb 15 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
模仿OSO的论坛(二)
2006/10/09 PHP
PHP实现图片旋转效果实例代码
2014/10/01 PHP
利用ajax和PHP实现简单的流程管理
2017/03/23 PHP
PHP中快速生成随机密码的几种方式
2017/04/17 PHP
php多文件打包下载的实例代码
2017/07/12 PHP
Windows上php5.6操作mongodb数据库示例【配置、连接、获取实例】
2019/02/13 PHP
使用PHP+Redis实现延迟任务,实现自动取消订单功能
2019/11/21 PHP
Javascript学习笔记之 函数篇(三) : 闭包和引用
2014/11/23 Javascript
jQuery中animate()方法用法实例
2014/12/24 Javascript
JQuery实现动态添加删除评论的方法
2015/05/18 Javascript
jQuery实现分隔条左右拖动功能
2015/11/21 Javascript
个人网站留言页面(前端jQuery编写、后台php读写MySQL)
2016/05/03 Javascript
JavaScript实现的冒泡排序法及统计相邻数交换次数示例
2017/04/26 Javascript
如何在AngularJs中调用第三方插件库
2017/05/21 Javascript
vue弹窗消息组件的使用方法
2020/09/24 Javascript
Javascript Promise用法详解
2018/05/10 Javascript
微信小程序实现折叠与展开文章功能
2018/06/12 Javascript
微信小程序项目实践之主页tab选项实现
2018/07/18 Javascript
10个最受欢迎的 JavaScript框架(推荐)
2019/04/24 Javascript
JS函数进阶之prototy用法实例分析
2020/01/15 Javascript
小程序卡片切换效果组件wxCardSwiper的实现
2020/02/13 Javascript
Python socket编程实例详解
2015/05/27 Python
Python下Fabric的简单部署方法
2015/07/14 Python
Python实现读取TXT文件数据并存进内置数据库SQLite3的方法
2017/08/08 Python
利用python对Excel中的特定数据提取并写入新表的方法
2018/06/14 Python
Python多继承原理与用法示例
2018/08/23 Python
python实现感知机线性分类模型示例代码
2019/06/02 Python
通过python改变图片特定区域的颜色详解
2019/07/15 Python
详解Python中的路径问题
2020/09/02 Python
Python中qutip用法示例详解
2020/10/02 Python
Python命令行参数argv和argparse该如何使用
2021/02/08 Python
Python 实现劳拉游戏的实例代码(四连环、重力四子棋)
2021/03/03 Python
爱尔兰电脑、家电和家具购物网站:Buy It Direct
2019/07/09 全球购物
捷克街头、运动和滑板一站式商店:BoardStar.cz
2019/10/06 全球购物
优秀学生自我鉴定范例
2013/12/18 职场文书
《蓝色的树叶》教学反思
2014/02/24 职场文书