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
?生?D片??C字串
Dec 06 PHP
php 模拟POST|GET操作实现代码
Jul 20 PHP
ThinkPHP 3.2 数据分页代码分享
Oct 14 PHP
php实现基于微信公众平台开发SDK(demo)扩展的方法
Dec 22 PHP
php基于表单密码验证与HTTP验证用法实例
Jan 06 PHP
php中使用base HTTP验证的方法
Apr 20 PHP
yii2 modal弹窗之ActiveForm ajax表单异步验证
Jun 13 PHP
Thinkphp5 微信公众号token验证不成功的原因及解决方法
Nov 12 PHP
使用Git实现Laravel项目的自动化部署
Nov 24 PHP
thinkphp框架无限级栏目的排序功能实现方法示例
Mar 29 PHP
PHP Ajax跨域问题解决方案代码实例
Aug 01 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
PHP聊天室技术
2006/10/09 PHP
js 覆盖和重载 函数
2009/09/25 Javascript
JS trim去空格的最佳实践
2011/10/30 Javascript
Jquery创建一个层当鼠标移动到层上面不消失效果
2013/12/12 Javascript
js如何获取兄弟、父类等节点
2014/01/06 Javascript
javascript实现html页面之间参数传递的四种方法实例分析
2015/12/15 Javascript
jQuery滚动新闻实现代码
2016/06/26 Javascript
基于vue的fullpage.js单页滚动插件
2017/03/20 Javascript
jquery实现异步加载图片(懒加载图片一种方式)
2017/04/24 jQuery
JS将unicode码转中文方法
2017/05/08 Javascript
Vue 父子组件的数据传递、修改和更新方法
2018/03/01 Javascript
在vue-cli项目中使用bootstrap的方法示例
2018/04/21 Javascript
微信小程序自定义tab实现多层tab嵌套功能
2018/06/15 Javascript
vue写h5页面的方法总结
2019/02/12 Javascript
浅谈Javascript中的对象和继承
2019/04/19 Javascript
js实现多图和单图上传显示
2019/12/18 Javascript
JS实现随机点名器
2020/04/12 Javascript
关于Node.js中频繁修改代码重启服务器的问题
2020/10/15 Javascript
Python 检查数组元素是否存在类似PHP isset()方法
2014/10/14 Python
pygame实现雷电游戏雏形开发
2018/11/20 Python
详解python中list的使用
2019/03/15 Python
Django项目中添加ldap登陆认证功能的实现
2019/04/04 Python
查看Python依赖包及其版本号信息的方法
2019/08/13 Python
SELENIUM自动化模拟键盘快捷键操作实现解析
2019/10/28 Python
Python 实现使用空值进行赋值 None
2020/03/12 Python
Django models filter筛选条件详解
2020/03/16 Python
python中查看.db文件中表格的名字及表格中的字段操作
2020/07/07 Python
CSS3 圆角效果
2009/07/15 HTML / CSS
html5的画布canvas——画出弧线、旋转的图形实例代码+效果图
2013/06/09 HTML / CSS
HTML5 source标签:媒介元素定义媒介资源
2018/01/29 HTML / CSS
白宫黑市官网:White House Black Market
2016/11/17 全球购物
古汉语文学求职信范文
2014/03/16 职场文书
关于青春的演讲稿800字
2014/08/22 职场文书
学校党员干部承诺书
2015/05/04 职场文书
地心历险记观后感
2015/06/15 职场文书
Python中requests做接口测试的方法
2021/05/30 Python