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添加MySQL数据记录代码
Jun 07 PHP
php 远程关机操作的代码
Dec 05 PHP
PHP获取163、gmail、126等邮箱联系人地址【已测试2009.10.10】
Oct 11 PHP
php addslashes及其他清除空格的方法是不安全的
Jan 25 PHP
PHP面向对象学习笔记之一 基础概念
Oct 06 PHP
利用中国天气预报接口实现简单天气预报
Jan 20 PHP
PHP模块memcached使用指南
Dec 08 PHP
php语言中使用json的技巧及json的实现代码详解
Oct 27 PHP
最新制作ThinkPHP3.2.3完全开发手册
Nov 23 PHP
微信支付开发订单查询实例
Jul 12 PHP
Laravel学习教程之从入口到输出过程详解
Aug 27 PHP
用php实现分页效果的示例代码
Dec 10 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将向Java靠拢
2006/10/09 PHP
ThinkPHP模板范围判断输出In标签与Range标签用法详解
2014/06/30 PHP
php 中phar包的使用教程详解
2018/10/26 PHP
js判断输入是否为正整数、浮点数等数字的函数代码
2010/11/17 Javascript
基于jquery的大众点评,分类导航实现代码
2011/08/23 Javascript
40个新鲜出炉的jQuery 插件和免费教程[上]
2012/07/24 Javascript
禁止ajax缓存获取程序最新数据的方法
2013/11/19 Javascript
浅谈重写window对象的方法
2014/12/29 Javascript
JavaScript中的函数声明和函数表达式区别浅析
2015/03/27 Javascript
JavaScript动态设置div的样式的方法
2015/12/26 Javascript
js将json格式的对象拼接成复杂的url参数方法
2016/05/25 Javascript
JS复制对应id的内容到粘贴板(Ctrl+C效果)
2017/01/23 Javascript
Vue.js 2.0 移动端拍照压缩图片上传预览功能
2017/03/06 Javascript
微信小程序实现渐入渐出动画效果
2019/06/13 Javascript
nodejs实现获取本地文件夹下图片信息功能示例
2019/06/22 NodeJs
layui监听工具栏的实例(操作列表按钮)
2019/09/10 Javascript
vue学习笔记之slot插槽基本用法实例分析
2020/02/01 Javascript
package.json各个属性说明详解
2020/03/11 Javascript
解决vue-loader加载不上的问题
2020/10/21 Javascript
Python实现句子翻译功能
2017/11/14 Python
python 内置模块详解
2019/01/01 Python
Python GUI自动化实现绕过验证码登录
2020/01/10 Python
利用4行Python代码监测每一行程序的运行时间和空间消耗
2020/04/22 Python
Python如何在单元测试中给对象打补丁
2020/08/03 Python
Python如何急速下载第三方库详解
2020/11/02 Python
CSS3 :default伪类选择器使用简介
2018/03/15 HTML / CSS
websocket+sockjs+stompjs详解及实例代码
2018/11/30 HTML / CSS
html5是什么_动力节点Java学院整理
2017/07/07 HTML / CSS
芝加哥牛排公司:Chicago Steak Company
2018/10/31 全球购物
英国时尚泳装品牌:Maru Swimwear
2019/10/06 全球购物
威盛公司软件C++工程师笔试题面试题
2012/07/16 面试题
自我鉴定注意事项
2014/01/19 职场文书
干部培训自我鉴定
2014/01/22 职场文书
期末评语大全
2014/05/04 职场文书
一年级数学上册复习计划
2015/01/17 职场文书
2016年国培研修日志
2015/11/13 职场文书