PHP实现自动识别Restful API的返回内容类型


Posted in PHP onFebruary 07, 2015

如题,PHP如何自动识别第三方Restful API的内容,自动渲染成 json、xml、html、serialize、csv、php等数据?

其实这也不难,因为Rest API也是基于http协议的,只要我们按照协议走,就能做到自动化识别 API 的内容,方法如下:

1、API服务端要返回明确的 http Content-Type头信息,如:

Content-Type: application/json; charset=utf-8
Content-Type: application/xml; charset=utf-8
Content-Type: text/html; charset=utf-8

2、PHP端(客户端)接收到上述头信息后,再酌情自动化处理,参考代码如下:

<?php
// 请求初始化
$url = 'https://3water.com';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);

// 返回的 http body 内容
$response = curl_exec($ch);

// 返回的 http header 的 Content-Type 的内容
$contentType = curl_getinfo($ch, 'content_type');

// 关闭请求资源
curl_close($ch);

// 结果自动格式输出
$autoDetectFormats = array(
 'application/xml' => 'xml',
 'text/xml'  => 'xml',
 'application/json' => 'json',
 'text/json'  => 'json',
 'text/csv'  => 'csv',
 'application/csv' => 'csv',
 'application/vnd.php.serialized' => 'serialize'
);

if (strpos($contentType, ';'))
{
 list($contentType) = explode(';', $contentType);
}

$contentType = trim($contentType);

if (array_key_exists($contentType, $autoDetectFormats))
{
 echo '_' . $autoDetectFormats[$contentType]($response);
}

//+++++++++++++++++++++++++++++++++++++++++++++++++++++++
// 常用 格式化 方法
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++

/**
 * 格式化xml输出
 */
function _xml($string)
{
 return $string ? (array)simplexml_load_string($string, 'SimpleXMLElement', LIBXML_NOCDATA) : array();
}

/**
 * 格式化csv输出
 */
function _csv($string)
{
 $data = array();

 $rows = explode("\n", trim($string));
 $headings = explode(',', array_shift($rows));
 foreach( $rows as $row )
 {
 // 利用 substr 去掉 开始 与 结尾 的 "
 $data_fields = explode('","', trim(substr($row, 1, -1)));
 if (count($data_fields) === count($headings))
 {
  $data[] = array_combine($headings, $data_fields);
 }
 }

 return $data;
}

/**
 * 格式化json输出
 */
function _json($string)
{
 return json_decode(trim($string), true);
}

/**
 * 反序列化输出
 */
function _serialize($string)
{
 return unserialize(trim($string));
}

/**
 * 执行PHP脚本输出
 */
function _php($string)
{
 $string = trim($string);
 $populated = array();
 eval("\$populated = \"$string\";");

 return $populated;
}
PHP 相关文章推荐
纯真IP数据库的应用 IP地址转化成十进制
Jun 14 PHP
第五章 php数组操作
Dec 30 PHP
php读取excel文件的简单实例
Aug 26 PHP
php中mysql连接和基本操作代码(快速测试使用,简单方便)
Apr 25 PHP
PHP中使用localhost连接Mysql不成功的解决方法
Aug 20 PHP
PHP查看当前变量类型的方法
Jul 31 PHP
100行PHP代码实现socks5代理服务器
Apr 28 PHP
利用PHPExcel读取Excel的数据和导出数据到Excel
May 12 PHP
yii插入数据库防并发的简单代码
May 27 PHP
PHP在弹框中获取foreach中遍历的id值并传递给地址栏
Jun 13 PHP
python进程与线程小结实例分析
Nov 11 PHP
php session_decode函数用法讲解
May 26 PHP
PHP curl CURLOPT_RETURNTRANSFER参数的作用使用实例
Feb 07 #PHP
迁移PHP版本到PHP7
Feb 06 #PHP
php include类文件超时问题处理
Feb 06 #PHP
PHP的cURL库简介及使用示例
Feb 06 #PHP
PHP实用函数分享之去除多余的0
Feb 06 #PHP
php定时执行任务设置详解
Feb 06 #PHP
PHP四舍五入、取整、round函数使用示例
Feb 06 #PHP
You might like
php Static关键字实用方法
2010/06/04 PHP
注意:php5.4删除了session_unregister函数
2013/08/05 PHP
C#静态方法与非静态方法实例分析
2014/09/22 PHP
CI框架源码解读之利用Hook.php文件完成功能扩展的方法
2016/05/18 PHP
PHP preg_match实现正则表达式匹配功能【输出是否匹配及匹配值】
2017/07/19 PHP
js小技巧--自动隐藏红叉叉
2007/08/13 Javascript
jQuery实现 注册时选择阅读条款 左右移动
2013/04/11 Javascript
将nodejs打包工具整合到鼠标右键的方法
2013/05/11 NodeJs
js判断ie版本号的简单实现代码
2014/03/05 Javascript
JS获取月份最后天数、最大天数与某日周数的方法
2015/12/08 Javascript
JavaScript的兼容性与调试技巧
2016/11/22 Javascript
Bootstrap导航中表单简单实现代码
2017/03/06 Javascript
vue分类筛选filter方法简单实例
2017/03/30 Javascript
微信小程序内拖动图片实现移动、放大、旋转的方法
2018/09/04 Javascript
jquery实现图片无缝滚动 蒙版遮蔽效果
2020/01/11 jQuery
Element Tooltip 文字提示的使用示例
2020/07/26 Javascript
[57:47]Fnatic vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
python实现360皮肤按钮控件示例
2014/02/21 Python
Python中文件的读取和写入操作
2018/04/27 Python
python利用小波分析进行特征提取的实例
2019/01/09 Python
Python中的十大图像处理工具(小结)
2019/06/10 Python
python3.6 tkinter实现屏保小程序
2019/07/30 Python
英国著名的药妆网站:Escentual
2016/07/29 全球购物
Vilebrequin欧洲官网:法国豪华泳装品牌(男士沙滩裤)
2018/04/14 全球购物
SheIn沙特阿拉伯:女装在线
2020/03/23 全球购物
英文版银行求职信
2013/10/09 职场文书
秋天的雨教学反思
2014/04/27 职场文书
另类冲刺标语
2014/06/24 职场文书
网络管理员岗位职责
2015/02/12 职场文书
2015财务年终工作总结范文
2015/05/22 职场文书
房屋产权证明书
2015/06/19 职场文书
祝福语集锦:送给闺蜜的生日祝福语
2019/10/08 职场文书
PyTorch 实现L2正则化以及Dropout的操作
2021/05/27 Python
node.js如何自定义实现一个EventEmitter
2021/07/16 Javascript
mongodb的安装和开机自启动详细讲解
2021/08/02 MongoDB
永中文档在线转换预览基于nginx配置部署方案
2022/06/10 Servers