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与shell的3种交互方式介绍
Apr 11 Python
python模拟enum枚举类型的方法小结
Apr 30 Python
Python模拟登录验证码(代码简单)
Feb 06 Python
python+Django+apache的配置方法详解
Jun 01 Python
Python中的with语句与上下文管理器学习总结
Jun 28 Python
Flask实现跨域请求的处理方法
Sep 27 Python
Python3爬虫之自动查询天气并实现语音播报
Feb 21 Python
Python代码太长换行的实现
Jul 05 Python
Python Tkinter模块 GUI 可视化实例
Nov 20 Python
opencv python图像梯度实例详解
Feb 04 Python
动态设置django的model field的默认值操作步骤
Mar 30 Python
详解用selenium来下载小姐姐图片并保存
Jan 26 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笔记之:php函数range() round()和list()的使用说明
2013/04/26 PHP
Codeigniter框架实现获取分页数据和总条数的方法
2014/12/05 PHP
PHP书写格式详解(必看)
2016/05/23 PHP
php实现批量删除挂马文件及批量替换页面内容完整实例
2016/07/08 PHP
PHP中多线程的两个实现方法
2016/10/14 PHP
PHP实现原生态图片上传封装类方法
2016/11/08 PHP
符合标准的js表单提交的代码
2007/09/13 Javascript
基于jQuery的左右滚动实现代码
2010/12/03 Javascript
ajax不执行success回调而是执行了error回调
2012/12/10 Javascript
详解jquery easyui之datagrid使用参考
2016/12/05 Javascript
关于JavaScript的单双引号嵌套问题
2017/08/20 Javascript
Vue项目中如何引入icon图标
2018/03/28 Javascript
Vue+mui实现图片的本地缓存示例代码
2018/05/24 Javascript
Bootstrap实现模态框效果
2019/09/30 Javascript
js实现石头剪刀布游戏
2020/10/11 Javascript
python两种遍历字典(dict)的方法比较
2014/05/29 Python
Python编写百度贴吧的简单爬虫
2015/04/02 Python
Python批量按比例缩小图片脚本分享
2015/05/21 Python
Django自定义分页效果
2017/06/27 Python
pandas.DataFrame 根据条件新建列并赋值的方法
2018/04/08 Python
ERLANG和PYTHON互通实现过程详解
2019/07/05 Python
python爬虫之爬取百度音乐的实现方法
2019/08/24 Python
pytorch torch.expand和torch.repeat的区别详解
2019/11/05 Python
python实发邮件实例详解
2019/11/11 Python
Python FtpLib模块应用操作详解
2019/12/12 Python
Pandas直接读取sql脚本的方法
2021/01/21 Python
基于PyInstaller各参数的含义说明
2021/03/04 Python
英国家喻户晓的高街品牌:River Island
2017/11/28 全球购物
RetroStage德国:复古服装
2019/02/03 全球购物
执行力心得体会
2013/12/31 职场文书
活动总结怎么写
2014/04/28 职场文书
环境保护与污染治理求职信
2014/07/16 职场文书
2014年综治维稳工作总结
2014/11/17 职场文书
商务考察邀请函模板
2015/02/02 职场文书
2016年记者节感言
2015/12/08 职场文书
2016年国培心得体会及反思
2016/01/13 职场文书