Restful api 錯誤提示返回實現思路

序言

無論是微博仍是淘寶,他們都有本身的錯誤返回值格式規範,以及錯誤代碼說明,這樣不但手機端用起來方便,給人的感受也清晰明瞭,高大上。遇到問題先找母本,大公司的規範就是咱們參照的母本。爲此,我仿照了淘寶的錯誤返回值格式,根據微博錯誤代碼制定的標準自定了本身的錯誤代碼,而後在Restful api 上進行測試。下面我將實現思路以及測試結果分享給你們。php

實現思路

我利用抽象工廠模式去實現這樣的一個錯誤返回值。選擇這種模式是由於考慮到了這種模式能夠提供一個建立一系列相關或相互依賴對象的接口,與個人需求很接近。html

代碼分析

一、按這個路徑common\hint,我新建了個error文件夾存放個人錯誤提示程序文件。這文件夾中主要有這幾個文件:json

圖片描述

二、Hint.php入口文件。定義一個抽象類,裏邊只寫一個方法。api

interface  Hint {
    function  Error($_errors,$code);
}

三、Template.php 實現Hint這個接口。錯誤返回值的格式就在這裏定義。yii

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));
        }
    }
}

四、createMsg.php 再建立一個createMsg抽象類。將對象的建立抽象成一個接口。測試

interface  createMsg { 

    function Msg(); 
    
}

五、用FactoryMsg 類去實現createMsg接口。返回實例化的Template。spa

class FactoryMsg implements createMsg{
   
    function Msg() {
        return  new  Template;
    }

}

六、ErrorMsg.php 給Template裏邊的Error方法傳參。code

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');
          
    }

}

七、調用方式。htm

use common\hint\error\ErrorMsg;
ErrorMsg::Info(Yii::t('yii','failure'));

八、測試結果。對象

{
    "error": {
        "name": "Not Found",
        "message": "操做失敗",
        "error_code": "20003"
    }
}

完成。整個實現過程我採用語言包的形式,這樣有利於後期多語言的切換。

常見問題

一、採用這種字符串模糊搜索很泛,沒法達到具體錯誤類型返回對應具體代碼的要求。若有更好的建議,歡迎你們提議。

$result  = strstr($_errors,Yii::t('yii','Not exist'));

二、實現過程當中沒有考慮到從此多語言切換的問題,而後直接用傳統的方式傳提示語。好比:ErrorMsg::Info("操做失敗");這樣是沒法實現多語言切換的。建議你們用語言包的方式傳參。

相關資料

一、微博開放平臺:http://open.weibo.com/wiki/Error_code
二、淘寶開放平臺:http://open.taobao.com/doc2/apiDetail.ht...
三、PHP簡單工廠模式、工廠方法模式和抽象工廠模式比較:http://www.phpddt.com/php/php-factory.ht...

相關文章
相關標籤/搜索