起因
團隊中如果不同的專案,不同的人員可能在介面設計上有許多不統一的地方。導致了開發效率低下的問題。
由於我在工作中遇到了,所以整理下來,說一說自己的一些看法。
怎樣進行介面規範化
因為每個人對自己使用語言有不同的理解、http協議熟悉程度不同、思維邏輯、開發經驗不一樣。對介面規範有想法的人應該提出自己的觀點,給出自己的理由。讓別人去評價,討論出一套統一的規則,最終統一成乙個內部的標準。
形成統一標準後由相關人員寫出示例。例如前端要對get請求針對jquery.ajax、fetch、axios等請求庫給出示例**。以後直接參照示例**進行開發。
由於每個專案在定義介面時有許多不同的方式,我根據以往的經驗,從請求方法、請求頭、請求體、響應狀態碼、響應體等幾個方面對介面的規範說說自己的看法。
我對標準的理解
我們不同的專案使用的請求方式大概有兩種:
get、post
get、post、put、delete
如果使用前者,psot的url中應該指明要執行的動作,而後者不需要指定。
# 這裡例子中約定put是新增,post是修改
至於使用前者還是後者,我更傾向於前者。
如果使用後者時,什麼情況下使用psot、什麼情況下使用put,搜尋到了到了一些資料,但看不懂。
介面url
介面url應該見名知意,有一定的規律。
這裡我不太懂,就不做過多贅述。
資料型別的約定
前端請求中不應該有undefined,因為後端不支援(json也不支援)該資料型別。
如果content-type為multipart/form-data,前端不應該傳null,因為會被轉化成字串,後端不能判斷出這是使用者輸入還是null型別。
每個專案應該約定請求時下面這些資料代表什麼意思
null資料型別表示什麼
空字串型別表示什麼
get請求
作用get請求應該讀取資料,不應該產生任何的「***」操作。
這裡要注意一點瀏覽器對url長度是有限制的,如果查詢的url長度過長會引起不可預期的後果。可以採用post/put進行查詢。
方式get請求的引數應該放在請求的url中而不應該放在請求體中。
例如下面是乙個標準的這個get請求(不相關http頭字段已剔除)
post/put/delete請求
這三種請求方法傳引數格式都相同,下面以post為例。
post型別使用的方式非常多樣,見識過各種各樣奇葩的方式,也是耽誤時間最長的,嚴重影響開發進度。這裡只討論我認為標準的方式。
作用post請求用於新增、修改或刪除資料,少數情況下用於查詢資料。
方式post請求的引數必須放在請求體中。
而post的請求方式有四種方式:
multipart/form-data
text/xml
這幾種方式通過http頭中的content-type頭欄位進行控制。
multipart/form-data
我們現在使用的最多的是multipart/form-data。
張三------webkitformboundary2kbanazwv0mkcex0
content-disposition: form-data; name="userid"
------webkitformboundary2kbanazwv0mkcex0--
這種方式不適合複雜資料型別的傳遞,例如有個介面需要同時修改多個使用者:
const userlist = [
userid: 123,
username: '張三',
isadmin: true,
userid: 456,
username: '李四',
isadmin: false,
那麼在post請求時只能這麼做
張三,李四
------webkitformboundary2kbanazwv0mkcex0
content-disposition: form-data; name="isadmin"
1,0------webkitformboundary2kbanazwv0mkcex0--
更重要的是這種方式不支援資料型別,傳入的所有格式的資料都會轉成字串型別。後端經常要使用1表示true,需要將陣列或物件拆分開。
這是我推薦使用的方式,有效的彌補了multipart/form-data的缺陷。
但不知什麼原因現在我們團隊基本不使用這種方式。
下面是請求示例
[,]響應
不知道伺服器對於不同的處理會返回什麼樣的狀態碼,這裡不做討論。
我們會返回乙個邏輯狀態碼code與提示資訊msg,響應體像下面這樣。
}在此基礎上增加一些限制:
建議data欄位始終為物件型別
易於擴充套件,例如當前介面是使用者列表頁,data使用陣列。v2版本介面加入了分頁查詢,就必須使data變為物件型別了。
如果欄位為複雜型別,不允許為null
複雜型別包括陣列與物件。
為了方便閱讀,這裡將json字串轉化為了js物件。
const resbody = {
code: 200,
msg: '處理成功',
data: {
list: [
userid: 123,
username: '張三',
如果沒有資料的時候返回
const resbody = {
code: 200,
msg: '處理成功',
data: {
list: null,
這樣前端在遍歷list時,null會導致**出錯,應該始終保證該字段的資料型別不變,正確返回方式如下。
const resbody = {
code: 200,
msg: '處理成功',
data: {
list: ,
其他同時發表在github。
參考資料
python 規範化函式 python之規範化開發
src.py 這個檔案主要存放的就是核心邏輯功能,需要進行選擇的核心功能函式,都應該放在這個檔案中。通常將其存放在core資料夾下。import os from lib import common 引用lib檔案中的common模組 存放裝飾器 通過common.的方式引用 from conf im...
第一正規化定義極其規範化
第一正規化 第一正規化規定屬性域只能包含原子的 簡單的,不可分的 值,並且元組中任一屬性的值必須是乙個來自該屬性域的單個的值。因此,對於關係的乙個單個的元組,1nf不允許屬性值是乙個值集,乙個元組值或者兩者的組合。1.如果屬性值是乙個值集,則有三種方法使這樣乙個關係達到1nf 1 移去使該模式違背1...
python 20 規範化目錄
目錄3.劃分專案目錄 4.專案啟動檔案編寫 將 進行分類的優點 載入快 可讀性高 查詢修改簡單。統一相同的路徑,也就是統一相同的變數,中如果需要這個路徑時,直接引用即可,可以多次引用。存放在conf資料夾。common.py公共元件檔案,放置一些公用的函式 功能,以便其他主邏輯或者業務需求。存放在l...