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 相关文章推荐
php使用Smarty的相关注意事项及访问变量的几种方式
Dec 08 PHP
PHP 第二节 数据类型之数值型
Apr 28 PHP
PHP 伪静态技术原理以及突破原理实现介绍
Jul 12 PHP
php 批量替换程序的具体实现代码
Oct 04 PHP
php全角字符转换为半角函数
Feb 07 PHP
Linux下PHP加速器APC的安装与配置笔记
Oct 24 PHP
php实现cookie加密的方法
Mar 10 PHP
CodeIgniter实现从网站抓取图片并自动下载到文件夹里的方法
Jun 17 PHP
在CentOS系统上从零开始搭建WordPress博客的全流程记录
Apr 21 PHP
php is_executable判断给定文件名是否可执行实例
Sep 26 PHP
详解php中空字符串和0之间的关系
Oct 23 PHP
PHP实现的文件操作类及文件下载功能示例
Dec 24 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 编写的日历
2006/10/09 PHP
PHP中include()与require()的区别说明
2010/03/10 PHP
Yii使用技巧大汇总
2015/12/29 PHP
使用PHP连接数据库_实现用户数据的增删改查的整体操作示例
2017/09/01 PHP
PHP实现的迪科斯彻(Dijkstra)最短路径算法实例
2017/09/16 PHP
js chrome浏览器判断代码
2010/03/28 Javascript
JavaScript获取和设置CheckBox状态的简单方法
2013/07/05 Javascript
js中的如何定位固定层的位置
2014/06/15 Javascript
javascript使用for循环批量注册的事件不能正确获取索引值的解决方法
2014/12/20 Javascript
JavaScript操作class和style样式代码详解
2016/02/13 Javascript
超实用的JavaScript代码段 附使用方法
2016/05/22 Javascript
JavaScript简单获取页面图片原始尺寸的方法
2016/06/21 Javascript
简单实现js页面切换功能
2021/01/10 Javascript
Angular中$cacheFactory的作用和用法实例详解
2016/08/19 Javascript
网站发布后Bootstrap框架引用woff字体无法正常显示的解决方法
2016/11/24 Javascript
微信小程序 支付功能开发错误总结
2017/02/21 Javascript
AngularJS常见过滤器用法实例总结
2017/07/06 Javascript
使用OPENLAYERS3实现点选的方法
2020/09/24 Javascript
vue2.0 如何把子组件的数据传给父组件(推荐)
2018/01/15 Javascript
javascript实现摄像头拍照预览
2019/09/30 Javascript
Python类方法__init__和__del__构造、析构过程分析
2015/03/06 Python
收藏整理的一些Python常用方法和技巧
2015/05/18 Python
剖析Python的Tornado框架中session支持的实现代码
2015/08/21 Python
Kears 使用:通过回调函数保存最佳准确率下的模型操作
2020/06/17 Python
python 使用多线程创建一个Buffer缓存器的实现思路
2020/07/02 Python
男女时尚与复古风格在线购物:RoseGal(全球免费送货)
2017/07/19 全球购物
美国在线肉类和海鲜配送:Crowd Cow
2020/10/02 全球购物
专升本自我鉴定
2013/10/10 职场文书
大学毕业生通用自荐信范文
2013/10/31 职场文书
会计系中文个人求职信
2013/12/24 职场文书
优秀导游先进事迹材料
2014/01/25 职场文书
电脑销售顾问自荐信
2014/01/29 职场文书
党员教师群众路线思想汇报范文
2014/10/28 职场文书
陪护人员误工证明
2015/06/24 职场文书
mysql多表查询-笔记七
2021/04/05 MySQL
redis哨兵常用命令和监控示例详解
2021/05/27 Redis