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 相关文章推荐
JAVA/JSP学习系列之四
Oct 09 PHP
PHP+APACHE实现用户论证的方法
Oct 09 PHP
用header 发送cookie的php代码
Mar 16 PHP
php array_merge下进行数组合并的代码
Jul 22 PHP
发一个php简单的伪原创程序,配合商城采集用的
Oct 12 PHP
PHP实现批量生成App各种尺寸Logo
Mar 19 PHP
PHP怎样用正则抓取页面中的网址
Aug 09 PHP
浅谈php fopen下载远程文件的函数
Nov 18 PHP
PHP根据树的前序遍历和中序遍历构造树并输出后序遍历的方法
Nov 10 PHP
Laravel框架实现利用监听器进行sql语句记录功能
Jun 06 PHP
php 中htmlentities导致中文无法查询问题
Sep 10 PHP
PHP执行linux命令6个函数代码实例
Nov 24 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的declare控制符和ticks教程(附示例)
2014/03/21 PHP
使用ltrace工具跟踪PHP库函数调用的方法
2016/04/25 PHP
thinkPHP数据库增删改查操作方法实例详解
2016/12/06 PHP
PHP实现的策略模式示例
2019/03/20 PHP
PHP从零开始打造自己的MVC框架之入口文件实现方法详解
2019/06/03 PHP
PHP使用PDO 连接与连接管理操作实例分析
2020/04/21 PHP
javascript下操作css的float属性的特殊写法
2007/08/22 Javascript
JavaScript XML和string相互转化实现代码
2011/07/04 Javascript
一个简单的网站访问JS计数器 刷新1次加1次访问
2012/09/20 Javascript
实现只能输入数字的input不用replace方法
2013/09/12 Javascript
解决jquery版本冲突的有效方法
2014/09/02 Javascript
Bootstrap Modal对话框如何在关闭时触发事件
2016/12/02 Javascript
原生Javascript插件开发实践
2017/01/18 Javascript
从零开始学习Node.js系列教程一:http get和post用法分析
2017/04/13 Javascript
vue+iview动态渲染表格详解
2019/03/19 Javascript
微信小程序扫描二维码获取信息实例详解
2019/05/07 Javascript
Ant Design Vue 添加区分中英文的长度校验功能
2020/01/21 Javascript
JavaScript多种图形实现代码实例
2020/06/28 Javascript
web.py获取上传文件名的正确方法
2014/08/26 Python
Python中字典映射类型的学习教程
2015/08/20 Python
python 动态迁移solr数据过程解析
2019/09/04 Python
python 基于卡方值分箱算法的实现示例
2020/07/17 Python
零基础学Python之前需要学c语言吗
2020/07/21 Python
学习Python爬虫的几点建议
2020/08/05 Python
编译 pycaffe时报错:fatal error: numpy/arrayobject.h没有那个文件或目录
2020/11/29 Python
Python+MySQL随机试卷及答案生成程序的示例代码
2021/02/01 Python
纯css3实现图片翻牌特效
2015/03/10 HTML / CSS
HTML5新特性之用SVG绘制微信logo
2016/02/03 HTML / CSS
美国购买体育、音乐会和剧院门票网站:SelectATicket
2019/09/08 全球购物
幼儿园保育员辞职信
2014/01/12 职场文书
幼儿园家长会邀请函
2014/01/15 职场文书
文明风采获奖感言
2014/02/18 职场文书
HR求职自荐信范文
2014/06/21 职场文书
代办社保委托书范文
2014/10/06 职场文书
教师工作总结范文2014
2014/11/10 职场文书
Go语言基础知识点介绍
2021/07/04 Golang