RESTful架構是一種流行的網路軟體架構,它結構清晰,符合標準,易於理解,擴展方便。
REST是Representational State Transfer的縮寫,翻譯為「表現層狀態轉換」。表現層其實就是資源,因此可以理解為「資源狀態轉換」。
網路應用程式上的任何實體都可以看作是一種資源,透過一個URI(統一資源定位符)指向它。
序言
不管是微博還是淘寶,他們都有自己的錯誤返回值格式規範,以及錯誤代碼說明,這樣不但手機端用起來方便,給人的感覺也清晰明了,高大上。遇到問題先找母本,大公司的規範就是我們參照的母本。為此,我彷照了淘寶的錯誤返回值格式,根據微博錯誤代碼制定的標準自定了自己的錯誤代碼,然後在Restful api 上進行測試。下面我將實現想法以及測試結果分享給大家。
實現思路
我利用抽象工廠模式去實現這樣的一個錯誤回傳值。選擇這種模式是因為考慮到了這種模式可以提供一個創建一系列相關或相互依賴對象的接口,與我的需求很接近。
程式碼分析
1、按這個路徑commonhint,我新建了個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中Restful api 錯誤提示回傳值實現思路,包括了restful方面的內容,希望對PHP教程有興趣的朋友有所幫助。