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 相关文章推荐
新闻分类录入、显示系统
Oct 09 PHP
php 文件上传代码(限制jpg文件)
Jan 05 PHP
php连接数据库代码应用分析
May 29 PHP
用Php编写注册后Email激活验证的实例代码
Mar 11 PHP
本地机apache配置基于域名的虚拟主机详解
Aug 10 PHP
PH P5.2至5.5、5.6的新增功能详解
Jul 14 PHP
PHP获取表单所有复选框的值的方法
Aug 28 PHP
php实现的zip文件内容比较类
Sep 24 PHP
thinkPHP实现将excel导入到数据库中的方法
Apr 22 PHP
PHP获取真实客户端的真实IP
Mar 07 PHP
PHP编程获取图片的主色调的方法【基于Imagick扩展】
Aug 02 PHP
Laravel中Facade的加载过程与原理详解
Sep 22 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 解压rar文件及zip文件的方法
2014/05/05 PHP
PHP在线打包下载功能示例
2016/10/15 PHP
PHP截取发动短信内容的方法
2017/07/04 PHP
JQuery CSS样式控制 学习笔记
2009/07/23 Javascript
获取URL地址中的文件名和参数的javascript代码
2009/09/02 Javascript
Mootools 1.2教程 选项卡效果(Tabs)
2009/09/15 Javascript
js跨域问题之跨域iframe自适应大小实现代码
2010/07/17 Javascript
jquery select多选框的左右移动 具体实现代码
2013/07/03 Javascript
jquery ajax 局部刷新小案例
2014/02/08 Javascript
JS 获取浏览器和屏幕宽高等信息代码
2014/03/31 Javascript
ExtJS4利根据登录后不同的角色分配不同的树形菜单
2014/05/02 Javascript
深入理解javascript作用域和闭包
2014/09/23 Javascript
js实现简单排列组合的方法
2016/01/27 Javascript
原生javascript实现addClass,removeClass,hasClass函数
2016/02/25 Javascript
原生javascript实现解析XML文档与字符串
2016/03/01 Javascript
jQuery之简单的表单验证实例
2016/07/07 Javascript
网页瀑布流布局jQuery实现代码
2016/10/21 Javascript
jQuery获取this当前对象子元素对象的方法
2016/11/29 Javascript
Vue仿今日头条实例详解
2018/02/06 Javascript
node puppeteer(headless chrome)实现网站登录
2018/05/09 Javascript
js实现无限层级树形数据结构(创新算法)
2020/02/27 Javascript
Python教程之全局变量用法
2016/06/27 Python
python使用udp实现聊天器功能
2018/12/10 Python
Python+OpenCV+pyQt5录制双目摄像头视频的实例
2019/06/28 Python
django 邮件发送模块smtp使用详解
2019/07/22 Python
pycharm如何实现跨目录调用文件
2020/02/28 Python
Pytorch1.5.1版本安装的方法步骤
2020/12/31 Python
Perfume’s Club美国官网:西班牙第一家在线美容店
2020/06/10 全球购物
仓库保管员岗位职责
2013/12/20 职场文书
教师专业自荐书范文
2014/02/10 职场文书
个人实习生的自我评价
2014/02/16 职场文书
我与祖国共奋进演讲稿
2014/09/13 职场文书
结婚保证书(三从四德)
2015/02/26 职场文书
魂断蓝桥观后感
2015/06/10 职场文书
施工安全责任协议书
2016/03/23 职场文书
解决linux下redis数据库overcommit_memory问题
2022/02/24 Redis