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 相关文章推荐
一个php作的文本留言本的例子(二)
Oct 09 PHP
php中var_export与var_dump的区别分析
Aug 21 PHP
延长phpmyadmin登录时间的方法
Feb 06 PHP
取得单条网站评论以数组形式进行输出
Jul 28 PHP
smarty内置函数config_load用法实例
Jan 22 PHP
php生成固定长度纯数字编码的方法
Jul 09 PHP
分析PHP中单双引号的误区和双引号小隐患
Jul 19 PHP
yii2控制器Controller Ajax操作示例
Jul 23 PHP
基于PHPexecl类生成复杂的报表表头示例
Oct 14 PHP
php in_array() 检查数组中是否存在某个值详解
Nov 23 PHP
PHP中Trait及其应用详解
Feb 14 PHP
php服务器的系统详解
Oct 12 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
很实用的一个完整email发送程序
2006/10/09 PHP
laravel5表单唯一验证的实例代码
2019/09/30 PHP
Javascript的getYear、getFullYear、getUTCFullYear异同分享
2011/11/30 Javascript
js jquery ajax的几种用法总结(及优缺点介绍)
2014/01/28 Javascript
input标签内容改变的触发事件介绍
2014/06/18 Javascript
jquery easyui datagrid实现增加,修改,删除方法总结
2016/05/25 Javascript
Bootstrap按钮组简单实现代码
2017/03/06 Javascript
mac下的nodejs环境安装的步骤
2017/05/24 NodeJs
详解angularJS动态生成的页面中ng-click无效解决办法
2017/06/19 Javascript
微信小程序日期选择器实例代码
2018/07/18 Javascript
解决jQuery使用append添加的元素事件无效的问题
2018/08/30 jQuery
浅谈js中的bind
2019/03/18 Javascript
Layui数据表格 前后端json数据接收的方法
2019/09/19 Javascript
原生JavaScript实现的无缝滚动功能详解
2020/01/17 Javascript
es6数组之扩展运算符操作实例分析
2020/04/25 Javascript
[02:21]十步杀一人,千里不留行——DOTA2全新英雄天涯墨客展示
2018/08/29 DOTA
Python中设置变量作为默认值时容易遇到的错误
2015/04/03 Python
Python函数式编程指南(四):生成器详解
2015/06/24 Python
Python 装饰器深入理解
2017/03/16 Python
使用PyInstaller将python转成可执行文件exe笔记
2018/05/26 Python
浅谈Python 列表字典赋值的陷阱
2019/01/20 Python
详解python tkinter教程-事件绑定
2019/03/28 Python
Python坐标线性插值应用实现
2019/11/13 Python
python 日志模块 日志等级设置失效的解决方案
2020/05/26 Python
Python判断远程服务器上Excel文件是否被人打开的方法
2020/07/13 Python
CSS3中使用RGBa来调节透明度的教程
2016/05/09 HTML / CSS
丝芙兰法国官网:SEPHORA法国
2016/09/01 全球购物
德国婴儿推车和儿童安全座椅商店:BABYSHOP
2016/09/01 全球购物
Spartoo比利时:欧洲时尚购物网站
2017/12/06 全球购物
欧洲、亚洲、非洲和拉丁美洲的度假套餐:Great Value Vacations
2019/03/30 全球购物
如果NULL和0作为空指针常数是等价的,那我到底该用哪一个
2014/09/16 面试题
历史专业个人求职信范文
2013/12/07 职场文书
销售主管的自我评价分享
2014/01/03 职场文书
《莫高窟》教学反思
2014/02/25 职场文书
综治宣传月活动总结
2014/04/28 职场文书
世界十大评分最高的动漫,CLANNAD上榜,第八赚足人们眼泪
2022/03/18 日漫