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动态创建Flash动画
Oct 09 PHP
第九节--绑定
Nov 16 PHP
php数组总结篇(一)
Sep 30 PHP
使ecshop模板中可引用常量的实现方法
Jun 02 PHP
php中使用base HTTP验证的方法
Apr 20 PHP
php构造方法中析构方法在继承中的表现
Apr 12 PHP
php函数mkdir实现递归创建层级目录
Oct 27 PHP
php实现的pdo公共类定义与用法示例
Jul 19 PHP
PHP实现登录验证码校验功能
May 17 PHP
作为PHP程序员你要知道的另外一种日志
Jul 30 PHP
php用wangeditor3实现图片上传功能
Aug 22 PHP
php使用fputcsv实现大数据的导出操作详解
Feb 27 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
一个多文件上传的例子(原创)
2006/10/09 PHP
php5.3 goto函数介绍和示例
2014/03/21 PHP
destoon后台网站设置变成空白的解决方法
2014/06/21 PHP
如何使用PHP对网站验证码进行破解
2015/09/17 PHP
10个对初学者非常有用的PHP技巧
2016/04/06 PHP
php进程间通讯实例分析
2016/07/11 PHP
php 浮点数比较方法详解
2017/05/05 PHP
PHP实现的ID混淆算法类与用法示例
2018/08/10 PHP
PHP使用ajax的post方式下载excel文件简单示例
2019/08/06 PHP
JavaScript 三种不同位置代码的写法
2009/10/25 Javascript
JQuery文本改变触发事件如聚焦事件、失焦事件
2014/01/15 Javascript
jquery中ajax函数执行顺序问题之如何设置同步
2014/02/28 Javascript
AngularGauge 属性解析详解
2016/09/06 Javascript
js处理层级数据结构的方法小结
2017/01/17 Javascript
原生js实现移动端触摸轮播的示例代码
2017/12/22 Javascript
浅谈JavaScript_DOM学习篇_图片切换小案例
2019/03/19 Javascript
Node.js Domain 模块实例详解
2020/03/18 Javascript
vue项目或网页上实现文字转换成语音播放功能
2020/06/09 Javascript
JS sort排序详细使用方法示例解析
2020/09/27 Javascript
python实现的多线程端口扫描功能示例
2017/01/21 Python
Django admin实现图书管理系统菜鸟级教程完整实例
2017/12/12 Python
如何运行.ipynb文件的图文讲解
2019/06/27 Python
python 公共方法汇总解析
2019/09/16 Python
Python语法之精妙的十个知识点(装B语法)
2020/01/18 Python
python 字典item与iteritems的区别详解
2020/04/25 Python
python框架flask入门之环境搭建及开启调试
2020/06/07 Python
H5 canvas实现贪吃蛇小游戏
2017/07/28 HTML / CSS
韩语专业本科生求职信
2013/10/01 职场文书
手术室护士自我鉴定
2013/10/14 职场文书
顶岗实习接收函
2014/01/09 职场文书
教师年度考核自我鉴定
2014/01/19 职场文书
中学生期中自我鉴定
2014/04/20 职场文书
毕业生求职信范文
2014/06/29 职场文书
2016年五一促销广告语
2016/01/28 职场文书
如何在python中实现ECDSA你知道吗
2021/11/23 Python
英镑符号 £
2022/02/17 杂记