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 相关文章推荐
人大复印资料处理程序_补充篇
Oct 09 PHP
PHP实现图片简单上传
Oct 09 PHP
php5.2.0内存管理改进
Jan 22 PHP
下拉列表多级联动dropDownList示例代码
Jun 27 PHP
php实现通用的信用卡验证类
Mar 24 PHP
php中array_column函数简单实现方法
Jul 11 PHP
Yii基于CActiveForm的Ajax数据验证用法示例
Jul 14 PHP
php简单压缩css样式示例
Sep 22 PHP
php+mysql+jquery实现简易的检索自动补全提示功能
Apr 15 PHP
全面解析PHP面向对象的三大特征
Jun 10 PHP
在thinkphp5.0路径中实现去除index.php的方式
Oct 16 PHP
PHP 进程池与轮询调度算法实现多任务的示例代码
Nov 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
Yii PHP Framework实用入门教程(详细介绍)
2013/06/18 PHP
php采集中国代理服务器网的方法
2015/06/16 PHP
JQuery魔力之$(&quot;tagName&quot;)与selector
2012/03/05 Javascript
动态显示可输入的字数提示还可以输入的字数
2014/04/01 Javascript
基于JavaScript实现手机短信按钮倒计时(超简单)
2015/12/30 Javascript
jQuery获取字符串中出现最多的数
2016/02/22 Javascript
js滚轮事件兼容性问题需要注意哪些
2016/11/15 Javascript
JS一个简单的注册页面实例
2017/09/05 Javascript
最后说说Vue2 SSR 的 Cookies 问题
2018/05/25 Javascript
JavaScript 2018 中即将迎来的新功能
2018/09/21 Javascript
详解webpack loader和plugin编写
2018/10/12 Javascript
Node.js Event Loop各阶段讲解
2019/03/08 Javascript
浅析JavaScript异步代码优化
2019/03/18 Javascript
JQueryDOM之样式操作
2019/03/27 jQuery
Node.js Windows Binary二进制文件安装方法
2019/05/16 Javascript
详解vue-cli@2.x项目迁移日志
2019/06/06 Javascript
vue使用swiper.js重叠轮播组建样式
2019/11/14 Javascript
JS script脚本中async和defer区别详解
2020/06/24 Javascript
vue监听dom大小改变案例
2020/07/29 Javascript
[48:21]林俊杰圣堂刺客超神杀戮秀
2014/10/29 DOTA
Python验证文件是否可读写代码分享
2017/12/11 Python
python将文本中的空格替换为换行的方法
2018/03/19 Python
基于Python中numpy数组的合并实例讲解
2018/04/04 Python
浅谈python连续赋值可能引发的错误
2018/11/10 Python
python matplotlib库绘制散点图例题解析
2019/08/10 Python
中专毕业个人的自荐信格式
2013/09/21 职场文书
大学生水文观测实习自我鉴定
2013/09/29 职场文书
师范生自荐信
2013/10/27 职场文书
网络信息管理员岗位职责
2014/01/05 职场文书
治庸问责心得体会
2014/09/12 职场文书
高中生旷课检讨书
2014/10/08 职场文书
小学工作总结2015
2015/05/04 职场文书
欠款纠纷起诉状
2015/05/19 职场文书
2015年暑假工作总结
2015/07/13 职场文书
《杜鹃的婚约》OP主题曲「凸凹」无字幕影像公开
2022/04/08 日漫
三星 3nm 芯片将于第二季度开始量产
2022/04/29 数码科技