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中在数据库中保存Checkbox数据(1)
Oct 09 PHP
php后台程序与Javascript的两种交互方式
Oct 25 PHP
使用php shell命令合并图片的代码
Jun 23 PHP
php数组函数序列之array_slice() - 在数组中根据条件取出一段值,并返回
Nov 07 PHP
使用 PHPMAILER 发送邮件实例应用
Nov 07 PHP
php设计模式小结
Feb 15 PHP
php多功能图片处理类分享(php图片缩放类)
Mar 14 PHP
php数组添加与删除单元的常用函数实例分析
Feb 16 PHP
Linux系统下php获得系统分区信息的方法
Mar 30 PHP
PHP安装memcached扩展笔记
May 28 PHP
PHP 在数组中搜索给定的简单实例 array_search 函数
Jun 13 PHP
PHP学习记录之常用的魔术常量详解
Dec 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
探讨PHP函数ip2long转换IP时数值太大产生负数的解决方法
2013/06/06 PHP
PHP处理CSV表格文件的常用操作方法总结
2016/07/01 PHP
Tinymce+jQuery.Validation使用产生的BUG
2010/03/29 Javascript
jQuery下的动画处理总结
2013/10/10 Javascript
让checkbox不选中即将选中的checkbox不选中
2014/07/11 Javascript
原生js实现复制对象、扩展对象 类似jquery中的extend()方法
2014/08/30 Javascript
js通过location.search来获取页面传来的参数
2014/09/11 Javascript
jQuery焦点控制图层展示延迟隐藏的方法
2015/03/09 Javascript
Angularjs中如何使用filterFilter函数过滤
2016/02/06 Javascript
jquery+css3问卷答题卡翻页动画效果示例
2016/10/26 Javascript
jquery网页日历显示控件calendar3.1使用详解
2016/11/24 Javascript
js读取json文件片段中的数据实例
2017/03/09 Javascript
详解Angular 4.x NgTemplateOutlet
2017/05/24 Javascript
详解require.js配置路径的用法和css的引入
2017/09/06 Javascript
Angular实现的简单定时器功能示例
2017/12/28 Javascript
JS实现选项卡效果的代码实例
2019/05/20 Javascript
react用Redux中央仓库实现一个todolist
2019/09/29 Javascript
收集的几个Python小技巧分享
2014/11/22 Python
玩转python爬虫之cookie使用方法
2016/02/17 Python
详解python 字符串和日期之间转换 StringAndDate
2017/05/04 Python
简述Python2与Python3的不同点
2018/01/21 Python
Tensorflow卷积神经网络实例进阶
2018/05/24 Python
浅谈pandas用groupby后对层级索引levels的处理方法
2018/11/06 Python
Django 视图层(view)的使用
2018/11/09 Python
解决python3 Pycharm上连接数据库时报错的问题
2018/12/03 Python
python中pop()函数的语法与实例
2020/12/01 Python
python快速安装OpenCV的步骤记录
2021/02/22 Python
解决CSS3 transition-delay 属性默认值0不带单位失效的问题
2020/10/29 HTML / CSS
使用PDF.JS插件在HTML中预览PDF文件的方法
2018/08/29 HTML / CSS
大学自主招生自荐信
2013/12/16 职场文书
运动会解说词200字
2014/02/06 职场文书
调解员先进事迹材料
2014/02/07 职场文书
一份没有按时交货失信于客户的检讨书
2014/09/19 职场文书
大学生年度个人总结
2015/02/15 职场文书
详解Java实践之抽象工厂模式
2021/06/18 Java/Android
Python基于百度API识别并提取图片中文字
2021/06/27 Python