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实现用户认证及管理完全源码
Mar 11 PHP
用windows下编译过的eAccelerator for PHP 5.1.6实现php加速的使用方法
Sep 30 PHP
用PHP的ob_start() 控制您的浏览器cache
Aug 03 PHP
PHP 获取文件权限函数介绍
Jul 11 PHP
使用php验证复选框有效性的示例
Nov 13 PHP
关于URL最大长度限制的相关资料查证
Dec 23 PHP
了解PHP的返回引用和局部静态变量
Jun 04 PHP
如何写php守护进程(Daemon)
Dec 30 PHP
php注册登录系统简化版
Dec 28 PHP
PHP静态成员变量
Feb 14 PHP
PHP crypt()函数的用法讲解
Feb 15 PHP
PHP程序员简单的开展服务治理架构操作详解(一)
May 14 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中使用CURL伪造来路抓取页面或文件
2011/05/04 PHP
php开启安全模式后禁用的函数集合
2011/06/26 PHP
PHPMailer的主要功能特点和简单使用说明
2014/02/17 PHP
在WordPress中安装使用视频播放器插件Hana Flv Player
2016/01/04 PHP
PHP统计目录中文件以及目录中目录大小的方法
2016/01/09 PHP
[原创]PHP实现字节数Byte转换为KB、MB、GB、TB的方法
2017/08/31 PHP
PHP基于面向对象封装的分页类示例
2019/03/15 PHP
js String对象中常用方法小结(字符串操作)
2012/01/27 Javascript
使用JQUERY进行后台页面布局控制DIV实现左右式
2014/01/07 Javascript
超炫的jquery仿flash导航栏特效
2014/11/11 Javascript
jQuery实现根据类型自动显示和隐藏表单
2015/03/18 Javascript
jQuery scrollFix滚动定位插件
2015/04/01 Javascript
深入讲解AngularJS中的自定义指令的使用
2015/06/18 Javascript
javascript中的previousSibling和nextSibling的正确用法
2015/09/16 Javascript
JSON格式的时间/Date(2367828670431)/格式转为正常的年-月-日 格式的代码
2016/07/27 Javascript
Vue.js绑定HTML class数组语法错误的原因分析
2016/10/19 Javascript
JS字符串按逗号和回车分隔的方法
2017/04/25 Javascript
vue实现全选和反选功能
2017/08/31 Javascript
mpvue小程序循环动画开启暂停的实现方法
2019/05/15 Javascript
微信小程序实现日期格式化和倒计时
2020/11/01 Javascript
vue子路由跳转实现tab选项卡
2019/07/24 Javascript
微信小程序实现modal弹出框遮罩层组件(可带文本框)
2020/12/20 Javascript
[44:43]完美世界DOTA2联赛决赛日 FTD vs GXR 第一场 11.08
2020/11/11 DOTA
Python正则表达式经典入门教程
2017/05/22 Python
分数霸榜! python助你微信跳一跳拿高分
2018/01/08 Python
python 爬虫一键爬取 淘宝天猫宝贝页面主图颜色图和详情图的教程
2018/05/22 Python
python 通过类中一个方法获取另一个方法变量的实例
2019/01/22 Python
Python3安装Pillow与PIL的方法
2019/04/03 Python
PyQt QListWidget修改列表项item的行高方法
2019/06/20 Python
详解Python Qt的窗体开发的基本操作
2019/07/14 Python
pytorch 共享参数的示例
2019/08/17 Python
美国领先的奢侈美容零售商:Bluemercury
2017/07/26 全球购物
学习两会精神心得范文
2014/03/17 职场文书
铁人纪念馆观后感
2015/06/16 职场文书
Python3接口性能测试实例代码
2021/06/20 Python
ElementUI实现el-form表单重置功能按钮
2021/07/21 Javascript