python介面定義規範化 對介面規範的一些思考

2021-10-21 05:45:19 字數 3832 閱讀 9448

起因

團隊中如果不同的專案,不同的人員可能在介面設計上有許多不統一的地方。導致了開發效率低下的問題。

由於我在工作中遇到了,所以整理下來,說一說自己的一些看法。

怎樣進行介面規範化

因為每個人對自己使用語言有不同的理解、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...