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 相关文章推荐
4.与数据库的连接
Oct 09 PHP
PHP与MySQL开发中页面出现乱码的一种解决方法
Jul 29 PHP
php 分库分表hash算法
Nov 12 PHP
php 文件缓存函数
Oct 08 PHP
php读取文件内容的三种可行方法示例介绍
Feb 08 PHP
php jsonp单引号转义
Nov 23 PHP
10条php编程小技巧
Jul 07 PHP
PHP正则匹配反斜杠'\'和美元'$'的方法
Feb 08 PHP
tp5(thinkPHP5)框架实现多数据库查询的方法
Jan 10 PHP
Laravel5.1 框架路由基础详解
Jan 04 PHP
PHP autoload使用方法及步骤详解
Sep 05 PHP
PHP实现倒计时功能
Nov 16 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中实现中文字符进制转换原理分析
2011/12/06 PHP
php+jQuery.uploadify实现文件上传教程
2014/12/26 PHP
使用php实现从身份证中提取生日
2016/05/09 PHP
javascript一点特殊用法
2008/05/28 Javascript
JavaScript面向对象之体会[总结]
2008/11/13 Javascript
深入理解javaScript中的事件驱动
2013/05/21 Javascript
jquery获取一组checkbox的值(实例代码)
2013/11/04 Javascript
js 金额格式化来回转换示例
2014/02/23 Javascript
jquery.form.js用法之清空form的方法
2014/03/07 Javascript
javascript学习笔记(四)function函数部分
2014/09/30 Javascript
调试JavaScript中正则表达式中遇到的问题
2015/01/27 Javascript
简介JavaScript中search()方法的使用
2015/06/06 Javascript
关于JS中二维数组的声明方法
2016/09/24 Javascript
js实现复选框的全选和取消全选效果
2017/01/03 Javascript
Bootstrap导航简单实现代码
2017/03/06 Javascript
Angularjs单选框相关的示例代码
2017/08/17 Javascript
JS+jQuery实现注册信息的验证功能
2017/09/26 jQuery
原生JS实现的放大镜特效示例【测试可用】
2018/12/08 Javascript
vue计算属性computed、事件、监听器watch的使用讲解
2019/01/21 Javascript
python提取内容关键词的方法
2015/03/16 Python
python用10行代码实现对黄色图片的检测功能
2015/08/10 Python
python3实现暴力穷举博客园密码
2016/06/19 Python
使用numpy和PIL进行简单的图像处理方法
2018/07/02 Python
Sanic框架流式传输操作示例
2018/07/18 Python
Python、 Pycharm、Django安装详细教程(图文)
2019/04/12 Python
python+pygame实现坦克大战
2019/09/10 Python
DataFrame.groupby()所见的各种用法详解
2020/06/14 Python
Django如何实现防止XSS攻击
2020/10/13 Python
用python对oracle进行简单性能测试
2020/12/05 Python
CSS3 :nth-child()伪类选择器实现奇偶行显示不同样式
2013/11/05 HTML / CSS
Belstaff英国官方在线商店:Belstaff.co.uk
2021/02/09 全球购物
智能室内花园:Click & Grow
2021/01/29 全球购物
西班牙品牌鞋子、服装和配饰在线商店:Esdemarca
2021/02/17 全球购物
linux面试相关问题
2012/08/11 面试题
财务出纳岗位职责
2014/02/03 职场文书
Python中的 Set 与 dict
2022/03/13 Python