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 防注入函数(格式化数据)
Aug 08 PHP
七款最流行的PHP本地服务器分享
Feb 19 PHP
WIN8.1下搭建PHP5.6环境
Apr 29 PHP
PHP SPL标准库之SplFixedArray使用实例
May 12 PHP
PHP版本的选择5.2.17 5.3.27 5.3.28 5.4 5.5兼容性问题分析
Apr 04 PHP
PHP引用返回用法示例
May 28 PHP
YII2 实现多语言配置的方法分享
Jan 11 PHP
PHP实现图片批量打包下载功能
Mar 01 PHP
PHP中Laravel 关联查询返回错误id的解决方法
Apr 01 PHP
THINKPHP在添加数据的时候获取主键id的值方法
Apr 03 PHP
PHP使用gearman进行异步的邮件或短信发送操作详解
Feb 27 PHP
php开发最强大的IDE编辑的phpstorm 2020.2配置Xdebug调试的详细教程
Aug 17 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
真正面向对象编程:PHP5.01发布
2006/10/09 PHP
php程序效率优化的一些策略小结
2010/07/17 PHP
thinkPHP中create方法与令牌验证实例浅析
2015/12/08 PHP
PHP AjaxForm提交图片上传并显示图片源码
2016/11/29 PHP
PHP常见的几种攻击方式实例小结
2019/04/29 PHP
在 PHP 和 Laravel 中使用 Traits的方法
2019/11/13 PHP
清除网页历史记录,屏蔽后退按钮!
2008/12/22 Javascript
jQuery find和children方法使用
2011/01/31 Javascript
JS实现表格数据各种搜索功能的方法
2015/03/03 Javascript
详解AngularJS中的http拦截
2016/02/09 Javascript
AngularJS基础 ng-hide 指令用法及示例代码
2016/08/01 Javascript
实例分析浏览器中“JavaScript解析器”的工作原理
2016/12/12 Javascript
基于Node的React图片上传组件实现实例代码
2017/05/10 Javascript
jQuery实现导航栏头部菜单项点击后变换颜色的方法
2017/07/19 jQuery
vuejs使用递归组件实现树形目录的方法
2017/09/30 Javascript
angular.js和vue.js中实现函数去抖示例(debounce)
2018/01/18 Javascript
uniapp实现横向滚动选择日期
2020/10/21 Javascript
nuxt引入组件和公共样式的操作
2020/11/05 Javascript
Python中input和raw_input的一点区别
2014/10/21 Python
Python搭建FTP服务器的方法示例
2018/01/19 Python
Python实现扣除个人税后的工资计算器示例
2018/03/26 Python
在Windows中设置Python环境变量的实例讲解
2018/04/28 Python
pandas DataFrame行或列的删除方法的实现示例
2019/08/02 Python
弄懂这56个Python使用技巧(轻松掌握Python高效开发)
2019/09/18 Python
Django框架表单操作实例分析
2019/11/04 Python
python 生成正态分布数据,并绘图和解析
2020/12/21 Python
英国最大的美妆产品在线零售商之一:Beauty Bay
2017/09/29 全球购物
Desigual美国官方网站:西班牙服装品牌
2019/03/29 全球购物
大学生毕业自我鉴定
2013/11/06 职场文书
师范教师毕业鉴定
2014/01/13 职场文书
小学运动会口号
2014/06/07 职场文书
法人代表身份证明书及授权委托书
2014/09/16 职场文书
学校领导班子成员查摆问题及整改措施
2014/10/28 职场文书
狼牙山五壮士观后感
2015/06/09 职场文书
受欢迎的自荐信,就这么写!
2019/04/19 职场文书
德劲DE1105机评
2022/04/05 无线电