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 strlen mb_strlen计算中英文混排字符串长度
Jul 10 PHP
PHP高级对象构建 工厂模式的使用
Feb 05 PHP
PHP return语句的另一个作用
Jul 30 PHP
php计算指定目录下文件占用空间的方法
Mar 13 PHP
php实现的IMEI限制的短信验证码发送类
May 05 PHP
CI框架数据库查询之join用法分析
May 18 PHP
PHP 中使用explode()函数切割字符串为数组的示例
May 06 PHP
thinkPHP5分页功能实现方法分析
Oct 25 PHP
在Laravel5中正确设置文件权限的方法
May 22 PHP
PHP生成zip压缩包的常用方法示例
Aug 22 PHP
使用PHP开发留言板功能
Nov 19 PHP
让你的PHP,APACHE,NGINX支持大文件上传
Mar 09 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 引用是个坏习惯
2010/03/12 PHP
PHP Zip压缩 在线对文件进行压缩的函数
2010/05/26 PHP
phpword插件导出word文件时中文乱码问题处理方案
2014/08/19 PHP
在WordPress中实现发送http请求的相关函数解析
2015/12/29 PHP
addRule在firefox下的兼容写法
2006/11/30 Javascript
javascript 获取元素位置的快速方法 getBoundingClientRect()
2009/11/26 Javascript
用JQuery在网页中实现分隔条功能的代码
2012/08/09 Javascript
js实现鼠标经过时图片滚动停止的方法
2015/02/16 Javascript
Nodejs学习笔记之测试驱动
2015/04/16 NodeJs
jQuery实现checkbox全选的方法
2015/06/10 Javascript
浅谈JavaScript异常处理语句
2015/06/26 Javascript
在JavaScript应用中使用RequireJS来实现延迟加载
2015/07/01 Javascript
js实现的动画导航菜单效果代码
2015/09/10 Javascript
angular-ui-sortable实现可拖拽排序列表
2016/12/28 Javascript
JS获取鼠标位置距浏览器窗口距离的方法示例
2017/04/11 Javascript
详解Angular如何正确的操作DOM
2018/07/06 Javascript
vue elementui form表单验证的实现
2018/11/11 Javascript
Nodejs监听日志文件的变化的过程解析
2019/08/04 NodeJs
[01:04]DOTA2上海特锦赛现场采访 FreeAgain遭众解说围攻
2016/03/25 DOTA
浅谈pandas中DataFrame关于显示值省略的解决方法
2018/04/08 Python
python操作日志的封装方法(两种方法)
2019/05/23 Python
python 判断三个数字中的最大值实例代码
2019/07/24 Python
ubuntu 18.04 安装opencv3.4.5的教程(图解)
2019/11/04 Python
Python使用指定字符长度切分数据示例
2019/12/05 Python
pandas的resample重采样的使用
2020/04/24 Python
python IDLE添加行号显示教程
2020/04/25 Python
一款纯css3实现的竖形二级导航的实例教程
2014/12/11 HTML / CSS
html5 input输入实时检测以及延时优化
2018/07/18 HTML / CSS
英国领先的办公用品供应商:Viking
2016/08/01 全球购物
学校师德承诺书
2014/05/23 职场文书
村干部任职承诺书
2015/01/21 职场文书
初中信息技术教学计划
2015/01/22 职场文书
试用期解除劳动合同通知书
2015/04/16 职场文书
2015年秘书个人工作总结
2015/04/25 职场文书
幼儿园六一儿童节主持词
2015/06/30 职场文书
Nginx+Tomcat实现负载均衡、动静分离的原理解析
2021/03/31 Servers