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 相关文章推荐
PHP4实际应用经验篇(8)
Oct 09 PHP
实现获取http内容的php函数分享
Feb 16 PHP
PHP文件大小格式化函数合集
Mar 10 PHP
zf框架db类的分页示例分享
Mar 14 PHP
php 邮件发送问题解决
Mar 22 PHP
一个PHP的ZIP压缩类分享
May 04 PHP
微信公众平台消息接口校验与消息接口响应实例
Dec 23 PHP
php实现httpRequest的方法
Mar 13 PHP
php实现只保留mysql中最新1000条记录
Jun 18 PHP
PHP实现递归目录的5种方法
Oct 27 PHP
php源码之将图片转化为data/base64数据流实例详解
Nov 27 PHP
PHP策略模式定义与用法示例
Jul 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
PHP Cookei记录用户历史浏览信息的代码
2016/02/03 PHP
Thinkphp框架开发移动端接口(1)
2016/08/18 PHP
PHP在线打包下载功能示例
2016/10/15 PHP
PHP多种序列化/反序列化的方法详解
2017/06/23 PHP
js判断一个字符串是否包含一个子串的方法
2015/01/26 Javascript
JS实现点击文字对应DIV层不停闪动效果的方法
2015/03/02 Javascript
Javascript 6里的4个新语法
2016/08/25 Javascript
基于vuejs+webpack的日期选择插件
2020/05/21 Javascript
js实现3d悬浮效果
2017/02/16 Javascript
微信小程序 本地图片按照屏幕尺寸处理
2017/08/04 Javascript
React-Native左右联动List的示例代码
2017/09/21 Javascript
Vue.js递归组件构建树形菜单
2017/12/24 Javascript
对angularJs中controller控制器scope父子集作用域的实例讲解
2018/10/08 Javascript
全面了解JavaScript的作用域链
2019/04/03 Javascript
三步实现ionic3点击退出app程序
2019/09/17 Javascript
Vue3.0数据响应式原理详解
2019/10/09 Javascript
vue-form表单验证是否为空值的实例详解
2019/10/29 Javascript
JavaScript常用工具函数大全
2020/05/06 Javascript
[04:36]DOTA2国际邀请赛 ti3精彩集锦
2013/08/19 DOTA
Python转码问题的解决方法
2008/10/07 Python
python用10行代码实现对黄色图片的检测功能
2015/08/10 Python
Python实现列表删除重复元素的三种常用方法分析
2017/11/24 Python
详解django三种文件下载方式
2018/04/06 Python
Python线程同步的实现代码
2018/10/03 Python
PyQt5 实现给窗口设置背景图片的方法
2019/06/13 Python
python networkx 根据图的权重画图实现
2019/07/10 Python
python实现图片九宫格分割
2021/03/07 Python
Python中的延迟绑定原理详解
2019/10/11 Python
django 模版关闭转义方式
2020/05/14 Python
python matlab库简单用法讲解
2020/12/31 Python
阿里巴巴英国:Alibaba英国
2019/12/11 全球购物
张思德观后感
2015/06/09 职场文书
事业单位工作人员2015年度思想工作总结
2015/10/15 职场文书
centos8安装nginx1.9.1的详细过程
2021/08/02 Servers
python实现双链表
2022/05/25 Python
如何利用python实现Simhash算法
2022/06/28 Python