PHP中Restful api 错误提示返回值实现思路


Posted in PHP onApril 12, 2016

RESTful架构是一种流行的互联网软件架构,它结构清晰,符合标准,易于理解,扩展方便。

REST是Representational State Transfer的缩写,翻译为“表现层状态转化”。表现层其实就是资源,因此可以理解为“资源状态转化”。

网络应用上的任何实体都可以看作是一种资源,通过一个URI(统一资源定位符)指向它。

序言

不管是微博还是淘宝,他们都有自己的错误返回值格式规范,以及错误代码说明,这样不但手机端用起来方便,给人的感觉也清晰明了,高大上。遇到问题先找母本,大公司的规范就是我们参照的母本。为此,我仿照了淘宝的错误返回值格式,根据微博错误代码制定的标准自定了自己的错误代码,然后在Restful api 上进行测试。下面我将实现思路以及测试结果分享给大家。

实现思路

我利用抽象工厂模式去实现这样的一个错误返回值。选择这种模式是因为考虑到了这种模式可以提供一个创建一系列相关或相互依赖对象的接口,与我的需求很接近。

代码分析

1、按这个路径common\hint,我新建了个error文件夹存放我的错误提示程序文件。这文件夹中主要有这几个文件:

2、Hint.php入口文件。定义一个抽象类,里边只写一个方法。

interface Hint {
function Error($_errors,$code);
}

3、Template.php 实现Hint这个接口。错误返回值的格式就在这里定义。

class Template implements Hint{
function Error($_errors,$code) { 
if (empty($_errors)) {
print_r(json_encode([]));
} else { 
$errors['error']['name'] = 'Not Found';
$errors['error']['message'] = $_errors;
$errors['error']['error_code'] = $code; 
print_r(json_encode($errors));
}
}
}

4、createMsg.php 再创建一个createMsg抽象类。将对象的创建抽象成一个接口。

interface createMsg { 
function Msg(); 
}

5、用FactoryMsg 类去实现createMsg接口。返回实例化的Template。

class FactoryMsg implements createMsg{
function Msg() {
return new Template;
}
}

6、ErrorMsg.php 给Template里边的Error方法传参。

class ErrorMsg {
// 抽象工厂里的静态方法
public static function Info($_errors) { 
$Factory = new FactoryMsg;
$result = strstr($_errors,Yii::t('yii','Not exist')); //数据不存在 20001
$result1 = strstr($_errors,Yii::t('yii','Null')); //参数不能为空 20002
$result2 = strstr($_errors,Yii::t('yii','Fail')); //新增、更新、删除失败 20003
$result3 = strstr($_errors,Yii::t('yii','Not right')); //XX不正确 20004
$result4 = strstr($_errors,Yii::t('yii','Robc')); //XX无权限 20005
//数据不存在 20001
if(!empty($result)){ 
$M = $Factory->Msg();
$M->Error($_errors,'20001');die;
}
//参数不能为空 20002
if(!empty($result1)){ 
$M = $Factory->Msg();
$M->Error($_errors,'20002');die;
}
//新增、更新、删除失败 20003
if(!empty($result2)){ 
$M = $Factory->Msg();
$M->Error($_errors,'20003');die;
}
//XX不正确 20004
if(!empty($result3)){ 
$M = $Factory->Msg();
$M->Error($_errors,'20004');die;
}
//XX无权限 20005
if(!empty($result4)){ 
$M = $Factory->Msg();
$M->Error($_errors,'20005');die;
}
//默认类型 21000
$M = $Factory->Msg();
$M->Error($_errors,'21000');
}
}

7、调用方式。

use common\hint\error\ErrorMsg;
ErrorMsg::Info(Yii::t('yii','failure'));

8、测试结果。

{
"error": {
"name": "Not Found",
"message": "操作失败",
"error_code": "20003"
}
}

完成。整个实现过程我采用语言包的形式,这样有利于后期多语言的切换。

常见问题

1、采用这种字符串模糊搜索很泛,无法达到具体错误类型返回对应具体代码的要求。如有更好的建议,欢迎大家提议。

$result = strstr($_errors,Yii::t('yii','Not exist'));

2、实现过程中没有考虑到今后多语言切换的问题,然后直接用传统的方式传提示语。比如:ErrorMsg::Info("操作失败");这样是无法实现多语言切换的。建议大家用语言包的方式传参。

PHP 相关文章推荐
linux下 C语言对 php 扩展
Dec 14 PHP
php新建文件自动编号的思路与实现
Jun 27 PHP
解析php中memcache的应用
Jun 18 PHP
php中json_encode处理gbk与gb2312中文乱码问题的解决方法
Jul 10 PHP
用 Composer构建自己的 PHP 框架之构建路由
Oct 30 PHP
php中session_id()函数详细介绍,会话id生成过程及session id长度
Sep 23 PHP
给WordPress的编辑后台添加提示框的代码实例分享
Dec 25 PHP
PHP mysql事务问题实例分析
Jan 18 PHP
PHP支付系统设计与典型案例分享
Aug 02 PHP
PHPExcel导出2003和2007的excel文档功能示例
Jan 04 PHP
PHP实现基于面向对象的mysqli扩展库增删改查操作工具类
Jul 18 PHP
PHP读取Excel内的图片(phpspreadsheet和PHPExcel扩展库)
Nov 19 PHP
PHP给文字内容中的关键字进行套红处理
Apr 12 #PHP
PHP实现的通过参数生成MYSQL语句类完整实例
Apr 11 #PHP
PHP实现的浏览器检查类
Apr 11 #PHP
PHP模板引擎Smarty内建函数section,sectionelse用法详解
Apr 11 #PHP
PHP模板引擎Smarty内建函数详解
Apr 11 #PHP
PHP模板引擎Smarty内置变量调解器用法详解
Apr 11 #PHP
PHP模板引擎Smarty自定义变量调解器用法
Apr 11 #PHP
You might like
建立动态的WML站点(三)
2006/10/09 PHP
php基础知识:函数基础知识
2006/12/13 PHP
真正根据utf8编码的规律来进行截取字符串的函数(utf8版sub_str )
2012/10/24 PHP
PHP+shell实现多线程的方法
2015/07/01 PHP
网上应用的一个不错common.js脚本
2007/08/08 Javascript
javascript操作cookie_获取与修改代码
2009/05/21 Javascript
Javascript学习笔记6 prototype的提出
2010/01/11 Javascript
String.prototype实现的一些javascript函数介绍
2013/11/22 Javascript
javascript中全局对象的parseInt()方法使用介绍
2013/12/19 Javascript
JS去除字符串两端空格的简单实例
2013/12/27 Javascript
jquery 操作css样式、位置、尺寸方法汇总
2014/11/28 Javascript
js实现使用鼠标拖拽切换图片的方法
2015/05/04 Javascript
js判断所有表单项不为空则提交表单的实现方法
2016/09/09 Javascript
使用node.js中的Buffer类处理二进制数据的方法
2016/11/26 Javascript
bootstrap导航、选项卡实现代码
2016/12/28 Javascript
JS闭包可被利用的常见场景小结
2017/04/09 Javascript
用js实现每隔一秒刷新时间的实例(含年月日时分秒)
2017/10/25 Javascript
Node.JS段点续传:Nginx配置文件分段下载功能的实现方法
2018/03/12 Javascript
微信小程序图表插件wx-charts用法实例详解
2019/05/20 Javascript
继承行为在 ES5 与 ES6 中的区别详解
2019/12/24 Javascript
python判断字符串是否纯数字的方法
2014/11/19 Python
python脚本实现xls(xlsx)转成csv
2016/04/10 Python
使用Python批量修改文件名的代码实例
2019/01/24 Python
详解Python 函数如何重载?
2019/04/23 Python
django中使用POST方法获取POST数据
2019/08/20 Python
python3.7添加dlib模块的方法
2020/07/01 Python
Python数据可视化实现漏斗图过程图解
2020/07/20 Python
Python结合百度语音识别实现实时翻译软件的实现
2021/01/18 Python
松本清官方海外旗舰店:日本最大的药妆连锁店
2017/11/21 全球购物
下面这个程序执行后会有什么错误或者效果
2014/11/03 面试题
招聘单位介绍信
2014/01/14 职场文书
国际残疾人日广播稿范文
2014/10/09 职场文书
幼师求职自荐信
2015/03/26 职场文书
Python pandas求方差和标准差的方法实例
2021/08/04 Python
PyTorch中permute的使用方法
2022/04/26 Python
Win11如何查看显卡型号 Win11查看显卡型号的方法
2022/08/14 数码科技