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下使用SMTP发邮件的代码
Jan 10 PHP
php mssql 时间格式问题
Jan 13 PHP
PHP5 字符串处理函数大全
Mar 23 PHP
支持中文的php加密解密类代码
Nov 27 PHP
慎用preg_replace危险的/e修饰符(一句话后门常用)
Jun 19 PHP
PHP扩展CURL的用法详解
Jun 20 PHP
php switch语句多个值匹配同一代码块应用示例
Jul 29 PHP
php制作文本式留言板
Mar 18 PHP
thinkphp框架实现数据添加和显示功能
Jun 29 PHP
Yii实现文章列表置顶功能示例
Oct 18 PHP
php基于闭包实现函数的自调用(递归)实例分析
Nov 11 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
音乐朗读剧《MARS RED》2021年TV动画化决定!
2020/03/06 日漫
德生PL450的电路分析和低放电路的改进办法
2021/03/02 无线电
PHP并发查询MySQL的实例代码
2017/08/09 PHP
PHP商品秒杀问题解决方案实例详解【mysql与redis】
2019/07/22 PHP
Javascript 继承机制的实现
2009/08/12 Javascript
js常用代码段整理
2011/11/30 Javascript
随鼠标上下滚动的jquery代码
2013/12/05 Javascript
JavaScript中Cookie操作实例
2015/01/09 Javascript
jQuery实现鼠标滚动图片延迟加载效果附源码下载
2016/06/28 Javascript
ES6概念 Symbol.keyFor()方法
2016/12/25 Javascript
jQuery实现大图轮播
2017/02/13 Javascript
从零开始实现Vue简单的Toast插件
2018/12/03 Javascript
微信小程序发送短信验证码完整实例
2019/01/07 Javascript
vue Element左侧无限级菜单实现
2020/06/10 Javascript
如何利用node转发请求详解
2020/09/17 Javascript
原生JavaScript实现留言板
2021/01/10 Javascript
[01:02:03]2014 DOTA2华西杯精英邀请赛 5 24 NewBee VS VG
2014/05/26 DOTA
[02:49]DOTA2完美大师赛首日观众采访
2017/11/23 DOTA
Python使用bs4获取58同城城市分类的方法
2015/07/08 Python
Python常见异常分类与处理方法
2017/06/04 Python
python使用udp实现聊天器功能
2018/12/10 Python
用Python写一个模拟qq聊天小程序的代码实例
2019/03/06 Python
pandas.cut具体使用总结
2019/06/24 Python
python实现代码统计器
2019/09/19 Python
python3 求约数的实例
2019/12/05 Python
python super()函数的基本使用
2020/09/10 Python
意大利会呼吸的鞋:Geox健乐士
2017/02/12 全球购物
美国葡萄酒网上商店:Martha Stewart Wine Co.
2019/03/17 全球购物
Myprotein荷兰官网:欧洲第一运动营养品牌
2020/07/11 全球购物
大三在校生电子商务求职信
2013/10/29 职场文书
会计毕业生自我鉴定
2013/11/04 职场文书
大学新闻系应届生求职信
2014/06/02 职场文书
公司授权委托书格式样本
2014/10/01 职场文书
保研推荐信范文
2015/03/25 职场文书
大学推普周活动总结
2015/05/07 职场文书
小学班主任工作随笔
2015/08/15 职场文书