天天看點

全流程開發 | 高并發電商服務系統 | 第 2 關 | 通用 API 資料格式0. 通用 API 資料格式資料1. 通用 API 資料格式 資料​優化

(目錄)

0. 通用 API 資料格式資料

‌當我們去通路一個不存在的控制器【可了解為接口,路由】,‌‌或者控制器裡的某個方法不存在,這時候我們會給出一個非常友好的資料格式輸出,這樣的話‌‌我們的前端或者說我們的用戶端 APP 就能夠識别到我們的資料,‌‌

細心的小夥伴可能就發現一個問題,什麼問題?

BaseController.php

<?php
namespace app\controller;
class Error {
	public function __call($name,$arguments)
        {
		// TODO: Implement __call() method.
		$result = [
			'status' => 0,
			'message' => "找不到該控制器",
			'result' => null,
                ];
		return json($result,400);
        }
}
           

比如說我們在這個地方,

我們先‌‌給個 status 狀态碼,

然後 message 是錯誤提示,

result 是傳回的資料,

然後通過 json 直接傳回,‌‌

而這個地方也是當我們去通路一個類當中不存在的方法,它會走這個邏輯,

然後調用架構裡面的 json 把它輸出出去,後續如果有其他的 API,‌‌我們要去做的時候又是通過這種場景,比如說要去組裝 status,message,result,然後再用架構裡面的 json 去輸出相應的 API 的資料格式,‌‌這樣的話其實非常不友好,我們需要對這種代碼進行高度的優化,然後主要是為了解決什麼?‌

‌通用化的一個API資料格式輸出。‌

‌我組裝好之後我業務層去調用 我封裝好的通用化的 API 資料格式的方法,根本不需要去關注 status字段、message 字段、result 字段,因為這三個字段其實是定好的,當然了我們狀态碼定為 status 還是定為 code 的,這是根據我們前後端工程師來定的,‌‌我們不需要去 care,那麼前提是這三個字段定好了,那麼後續我在業務層我就不需要去關注了,我直接傳值就可以了,‌‌對吧?‌

‌是以這是我們需要關注的一個細節,

我要封裝成一個通用化的方法,我放到什麼地方合适呢?‌‌

項目工程目錄裡有個

common.php

檔案,‌‌它是一個應用公共檔案,我們的一些公共方法就可以放在這個裡面,

common.php

<?php
// 應用公共檔案
function show($status,$message = "error",$data=[],$httpStatus=200){
    $result = [
        'status' => $status,
        'message' => $message,
        'result' => $data
];
    return json($result,$httpStatus);
}

           

比如說我寫一個function叫show,‌‌

第一個參數我傳遞一個狀态碼,這個狀态碼是業務狀态碼 status ,它和我們 HTTP 的狀态碼還不一樣,‌‌比如說前端通路我們的 API 的時候,我們需要給一個狀态碼,比如說登入成功我給個100。

‌或者說‌‌輸入使用者名錯誤,我給一個-1001,

‌是這麼一個邏輯,這個是業務狀态碼,‌‌不要跟 HTTP 的狀态碼 弄混淆了,

然後到了 message 這個是‌‌錯誤提示或者說消息提示,比如說預設是給

error

,‌‌

然後第三個參數我們需要傳遞一個 data 的資料,預設給一個空數組,

然後第四個參數是傳遞我們的 HTTP 狀态碼,是以我叫 httpStatus‌‌ 預設我給 200 代表請求成功,比如說 404 不存在的位址,‌‌

那麼這個時候我們需要怎麼去做?‌

‌首先我把我們的 result 定義成一個變量,result 是個數組,

我就把 status 字段‌‌複制過來,

然後 message 字段,

然後 result‌‌ 接受 data,

然後再去調用架構裡面的 json,直接 return json(...),‌‌

第一參數是傳回的資料/字段,

第二個參數我需要傳遞我的狀态碼。‌

這個時候我們再來看一下,比如說現在在

BaseController.php

裡面,我不需要這樣去做了,我需要怎麼去做?‌‌

BaseController.php

<?php
namespace app\controller;
class Error {
	public function __call($name,$arguments)
        {
		// TODO: Implement __call() method.
		
		return show(-1,"找不到該{$name}方法",null,404);
        }
}
           

我現在直接這樣做就可以了,直接return,然後調用show 方法,那麼 show 方法我傳遞幾個參數,‌‌

我們看到

第一個參數是狀态碼,0就代表失敗,

第二個參數是提示資訊,找不到該{$name}方法,

第三個參數是傳回的内容/資料,我讓它輸出一個 null,

第四個參數是 HTTP 狀态碼,我讓它 404 。‌

1. 通用 API 資料格式 資料​優化

本小節在上一小節的基礎之上進行相應的優化。‌

‌怎麼去了解?比如說我們這個地方,‌‌

return show(-1,"找不到該{$name}方法",null,404);

我們傳一個狀态是-1,這個狀态我們說了它是業務狀态,和業務相關的,那麼業務狀态‌‌可能有很多種,對吧?不同的場景它的業務狀态不一樣,比如說成功我們可以給為 1,那麼這個狀态是‌‌前端工程師和後端工程師來定的,強調一下是雙方來定的,定了之後‌‌後續建議不要修改,萬不得已的場景下可以修改,

這個時候我們‌‌會面臨到一個問題,大家想想比如說我們的業務 狀态碼很多,比如說登入的時候,登入成功,‌‌登入失敗,驗證碼輸入錯誤,使用者名被人注冊了等等,這些都是和‌‌業務相關的一種提示,這樣的話後端工程師需要去給一個相應的狀态給前端,‌‌這樣的話可能後續我們項目當中的業務當中很多,比如說從-100‌‌ 到 -99等等到後續的比如01234567等等,那麼這個時候我們每次都在‌‌代碼裡面去寫這個狀态碼的時候,‌‌此時就非常不好管理,是以這個時候我們需要把它抽離出來,放在一個配置檔案裡面去,‌‌讓它生成一個類似于這種對應關系,這樣的話我就很好管理。‌

‌下一次我一看到有這種狀态碼的時候,我直接看這個檔案就可以了,‌‌是以說我們需要把它抽離出來,‌‌怎麼去抽離?

這個時候,我們再這樣來寫,在我們這個項目當中的 config 檔案夾下面是存放一些我們的配置檔案,‌‌我建立一個專門和業務狀态碼相關的檔案,我取名叫做 status,我寫個注釋,‌‌該檔案主要是存放‌‌業務狀态碼相關的配置。‌

status.php

代碼如下:

<?php
/** 該檔案主要是存放業務狀态碼相關的配置 ...*/
return [
    "success" => 1,
    "error"   => 0,
    "not_login" => -1,
    "user_is_register" => -2,
    "action_not_found" => -3,
    "controller_not_found" => -4,
];
           

比如說我們成功 success ,‌‌我給 1 代表成功,比如 error 通用錯誤,我給 0,

比如說沒有登入 not_login,比如說給個-1,‌‌

比如說如果還有使用者已經被注冊,比如說user_is_register,我給個 -2,‌‌代表使用者被注冊了,因為在我們後續的項目當中有登入注冊的‌‌這麼一種場景,比如說使用者‌‌輸入一個使用者名去注冊,後端肯定要根據使用者名去檢查一下我們使用者名是否被注冊了,‌‌如果注冊了,我們需要給一個狀态碼給前端,然後前端工程師或者說前端的邏輯,它就會根據我們傳回的‌‌狀态碼,它會做相應的業務處理。‌

‌是以說這是需要我們關注的,關于狀态碼在我們項目當中肯定有很多種特别多,‌‌是以說我們最好把它放到一個單獨的檔案裡面去管理,這樣的話我們下次去找到它也很友善,‌‌并且非常利于我們的維護。

是以這一點是需要我們去做處理的,不能把它所有的比如說0 -1 這些數字寫的‌‌代碼裡面,這是非常不合理的,隻能說最好是把它放到單獨的配置檔案裡面去,然後在我們的業務層代碼裡面,我們直接去‌‌讀取這個配置就可以了。‌

‌那麼現在我們怎麼去讀取,我們可以在這個地方,比如說

BaseController.php

,代碼如下:

BaseController.php

<?php
namespace app\controller;
class Error {
	public function __call($name,$arguments)
        {
		// TODO: Implement __call() method.
		
		return show(config("status.action_not_found"),"找不到該{$name}方法",null,404);
        }
}
           

因為我們說了

BaseController.php

裡面的

__call

,‌‌當我們去調用控制器裡面不存在的方法的時候,我們會走的邏輯,‌‌

然後是以說 show函數 的第一個參數我就換什麼,我讀取我們配置檔案裡面的 config,‌‌

然後它就是 status,這個 status 就代表我們什麼?‌

‌檔案

status.php

然後比如說我現在要讀取它裡面的‌‌某個配置,我再加一個配置,比如說叫做控制器不存在,我這樣寫

action_not_found

,我給個 -3 就代表控制器找不到,‌‌是以說我直接去調它就可以了,

‌下一次比如說我們找不到控制器,我們說過我們控制器找不到它會走到我們的

Error.php

裡面,‌‌

是以說這個地方的話我們也需要進行相應的更改,那麼我們就可以在‌‌我們配置檔案裡面加上

controller‌‌_not_found

,我給一個-4,‌‌

<?php
namespace app\controller;
class Error {
	public function __call($name,$arguments)
        {
		// TODO: Implement __call() method.
		$result = [
			'status' => config("status.controller_not_found"),
			'message' => "找不到該控制器",
			'result' => null,
                ];
		return json($result,400);
        }
}

           

繼續閱讀