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 相关文章推荐
ThinkPHP连接数据库及主从数据库的设置教程
Aug 22 PHP
php堆排序实现原理与应用方法
Jan 03 PHP
php文件缓存类用法实例分析
Apr 22 PHP
详解Laravel视图间共享数据与视图Composer
Aug 04 PHP
PHP请求Socket接口测试实例
Aug 12 PHP
php中替换字符串函数strtr()和str_repalce()的用法与区别
Nov 25 PHP
PHP 芝麻信用接入的注意事项
Dec 01 PHP
CodeIgniter框架基本增删改查操作示例
Mar 23 PHP
Laravel中如何增加自定义全局函数详解
May 09 PHP
PHP中phar包的使用教程
Jun 14 PHP
php语言注释,单行注释和多行注释
Jan 21 PHP
PHP中PCRE正则解析代码详解
Apr 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
全国FM电台频率大全 - 1 北京市
2020/03/11 无线电
PHP Class&amp;Object -- PHP 自排序二叉树的深入解析
2013/06/25 PHP
php获取远程图片体积大小的实例
2013/11/12 PHP
php如何修改SESSION的生存存储时间的实例代码
2017/07/05 PHP
PHP实现动态添加XML中数据的方法
2018/03/30 PHP
告诉大家什么是JSON
2008/06/10 Javascript
jQuery 选择表格(table)里的行和列及改变简单样式
2012/12/15 Javascript
利用js实现选项卡的特别效果的实例
2013/03/03 Javascript
用JavaScript修改CSS属性的代码
2013/05/06 Javascript
javascript实现信息增删改查的方法
2015/07/25 Javascript
学习JavaScript正则表达式
2015/11/13 Javascript
jQuery Easyui Datagrid实现单行的上移下移及保存移动的结果
2016/08/15 Javascript
JavaScript数据结构之优先队列与循环队列实例详解
2017/10/27 Javascript
详解vuex中mapState,mapGetters,mapMutations,mapActions的作用
2018/04/13 Javascript
详解elementUI中input框无法输入的问题
2020/04/27 Javascript
[42:20]Secret vs Liquid 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
简单介绍Python的Django框架的dj-scaffold项目
2015/05/30 Python
Django csrf 验证问题的实现
2018/10/09 Python
详解Python网络框架Django和Scrapy安装指南
2019/04/01 Python
Django中Middleware中的函数详解
2019/07/18 Python
在Django admin中编辑ManyToManyField的实现方法
2019/08/09 Python
python的命名规则知识点总结
2019/10/04 Python
python将数组n等分的实例
2019/12/02 Python
使用SimpleITK读取和保存NIfTI/DICOM文件实例
2020/07/01 Python
python--shutil移动文件到另一个路径的操作
2020/07/13 Python
DeinDesign德国:设计自己的手机壳
2019/12/14 全球购物
自荐信封面
2013/12/04 职场文书
消防器材管理制度
2014/01/28 职场文书
中药专业毕业自荐书范文
2014/02/08 职场文书
医药销售自我评价200字
2014/09/11 职场文书
民间借贷协议书范本
2014/10/01 职场文书
开展党的群众路线教育实践活动个人对照检查材料
2014/11/05 职场文书
幼儿园欢迎词范文
2015/01/26 职场文书
2015年网络舆情工作总结
2015/07/24 职场文书
Pytorch反向传播中的细节-计算梯度时的默认累加操作
2021/06/05 Python
Win11怎么跳过联网验机 ?Win11跳过联网验机激活教程
2022/04/05 数码科技