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 5.0 Pear安装方法
Dec 06 PHP
php中iconv函数使用方法
May 24 PHP
两个开源的Php输出Excel文件类
Feb 08 PHP
PHP 创建标签云函数代码
May 26 PHP
php缓冲 output_buffering的使用详解
Jun 13 PHP
解析yahoo邮件用phpmailer发送的实例
Jun 24 PHP
php颜色转换函数hex-rgb(将十六进制格式转成十进制格式)
Sep 23 PHP
CentOS下与Apache连接的PHP多版本共存方案实现详解
Dec 19 PHP
php实用代码片段整理
Nov 12 PHP
一键生成各种尺寸Icon的php脚本(实例)
Feb 08 PHP
Laravel推荐使用的十个辅助函数
May 10 PHP
PHP面向对象程序设计子类扩展父类(子类重新载入父类)操作详解
Jun 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
开启CURL扩展,让服务器支持PHP curl函数(远程采集)
2011/03/19 PHP
IIS安装Apache伪静态插件的具体操作图文
2013/07/01 PHP
php中stream(流)的用法
2014/03/25 PHP
php常用数学函数汇总
2014/11/21 PHP
php类中的$this,static,final,const,self这几个关键字使用方法
2015/12/14 PHP
php 数组随机取值的简单实例
2016/05/23 PHP
PHP var关键字相关原理及使用实例解析
2020/07/11 PHP
Prototype源码浅析 String部分(三)之HTML字符串处理
2012/01/15 Javascript
浅谈jQuery事件绑定原理
2015/01/02 Javascript
js实现将选中值累加到文本框的方法
2015/08/12 Javascript
js实现超酷的照片墙展示效果图附源码下载
2015/10/08 Javascript
基于jQuery实现左右图片轮播(原理通用)
2015/12/24 Javascript
jQuery 获取跨域XML(RSS)数据的相关总结分析
2016/05/18 Javascript
JS代码实现table数据分页效果
2016/05/26 Javascript
详解vue.js 开发环境搭建最简单攻略
2017/06/12 Javascript
基于JavaScript实现图片连播和联级菜单实例代码
2017/07/28 Javascript
基于对象合并功能的实现示例
2017/10/10 Javascript
详解vue + vuex + directives实现权限按钮的思路
2017/10/24 Javascript
Vue工程模板文件 webpack打包配置方法
2017/12/26 Javascript
Element Dropdown下拉菜单的使用方法
2020/07/26 Javascript
python中将阿拉伯数字转换成中文的实现代码
2011/05/19 Python
Python中type的构造函数参数含义说明
2015/06/21 Python
Python安装第三方库及常见问题处理方法汇总
2016/09/13 Python
Python内置函数OCT详解
2016/11/09 Python
Python进阶-函数默认参数(详解)
2017/05/18 Python
浅谈Python处理PDF的方法
2017/11/10 Python
如何在sae中设置django,让sae的工作环境跟本地python环境一致
2017/11/21 Python
Python Requests库基本用法示例
2018/08/20 Python
面向新手解析python Beautiful Soup基本用法
2020/07/11 Python
HTML5中使用postMessage实现Ajax跨域请求的方法
2016/04/19 HTML / CSS
应聘教师自荐信
2013/10/12 职场文书
农村婚礼证婚词
2014/01/08 职场文书
英语演讲开场白
2015/05/29 职场文书
赞助商致辞
2015/07/30 职场文书
SQL SERVER中常用日期函数的具体使用
2021/04/08 SQL Server
面试中老生常谈的MySQL问答集锦夯实基础
2022/03/13 MySQL