前后端接口對接規范(主要前端內容).md

restful最佳實踐--接口規范

為了前后端分工明確,對接流暢,確保可讀性和擴展性以及高可用、一致性,特約定下述無狀態RESTful API規范:

簡述

前后端分離意味著,前后端之間使? JSON 來交流,兩個開發團隊之間使? API 作為契約進?交互。從此,后臺選?的技術棧不影響前臺。當我們決定需要前后端分離時,我們仍然還需要?對?系列的問題:

  • 是否?夠的安全?我們怎么去存儲?戶數據,使? LocalStorage 的話,還要考慮加密。采?哪種認證?式來讓?戶登錄,并保存相應的狀態?
  • 是否有?夠的技術來?撐前后端分離?有沒有能?創建出符合 RESTful 風格的API?
  • 是否有能?維護 API 接口?當前端或者后臺需要修改接?時,是否能輕松地修改?前端和后臺兩個團隊是不是很容易合作?是不是可以輕松地進?聯調?
  • 前后端職責是否能明確?即:后臺提供數據,前端負責顯?。
  • 是否建?了前端的錯誤追蹤機制?能否幫助我們快速地定位出問題。

前后端分離的核?:后臺提供數據,前端負責顯?

前提

RESTful API 統一約束客戶端和服務器之間的接口。簡化和分離系統架構,使每個模塊獨立!

  • 請求中使用URI定位資源
  • 用HTTP Verbs[動詞](GET、POST、PUT、DELETE)描述操作(具體表現形式)
  • 數據傳遞(默認)采用:Content-Type: application/json; charset=utf-8

Rest

REST即表述性狀態傳遞(英文:Representational State Transfer,簡稱REST)是Roy Fielding博士在2000年他的博士論文中提出來的一種軟件架構風格。它是一種針對網絡應用的設計和開發方式,可以降低開發的復雜性,提高系統的可伸縮性。REST是設計風格而不是標準。REST通常基于使用HTTP,URI,和XML標準通用標記語言下的一個子集)以及HTML(標準通用標記語言下的一個應用)

統一接口(Uniform Interface)

統一接口約束定義客戶端和服務器之間的接口。它簡化了分離的結構,使各部分獨立發展。

無狀態(Stateless)

REST要求狀態要么被放入資源狀態中,要么保存在客戶端上。或者換句話說,服務器端不能保持除了單次請求之外的,任何與其通信的客戶端的通信狀態。從客戶端的每個請求要包含服務器所需要的所有信息。這樣做的最直接的理由就是可伸縮性—— 如果服務器需要保持客戶端狀態,那么大量的客戶端交互會嚴重影響服務器的內存可用空間(footprint)。

緩存(Cachable)

服務器返回信息必須被標記是否可以緩存,如果緩存,客戶端可能會重用之前的信息發送請求。

客戶-服務器(Client-Server)

客戶端無需關注數據存儲,服務器端無需關注用戶界面,提高了前后端可移植性。

分層系統(Layered System)

客戶端不關心直接連接到最終服務器還是連接到中間服務器。中間服務器可以通過啟用負載平衡和提供共享緩存來提高系統可擴展性。分層系統也可以執行安全策略。

支持按需代碼(Code on Demand,可選)

服務器可以通過傳輸邏輯來臨時擴展或定制客戶端的功能。

URL規范

GET https//domain.com/api/{模塊名}/{?菜單名}/{接口名}/:param

  • 不能使用大寫,用中橫線 - 不用下劃線 _

  • 使用名詞表示資源集合,使用復數形式(為確保所有API URIs保持一致),不能使用動詞;

  • 每個資源都至少有一個標識它的URI,同時應該遵循一個可預測的層次結構來提高可理解性,從而提高可用性;

  • 無需在URI中增加版本號,通過HTTP請求頭信息的字段中進行區分(或者在URI包含主版本信息,同時請求頭包含子版本信息。

    Accept: vnd.example-com.foo+json; version=1.1
    Accept: vnd.example-com.foo+json; version=2.0
    
這里寫圖片描述

Request

請求方法 說明 安全性 冪等性
GET(SELECT) 獲取資源 ?? ??
POST(CREATE) 創建資源 ? ?
PUT(UPDATE) 替換(新增或完整更新) ? ??
DELETE(DELETE) 刪除資源 ? ??
PATCH 是對 PUT 方法的補充,用來對已知資源進行局部更新 。 ? ??
OPTIONS 用于url驗證,驗證接口服務是否正常 ?? ??
TRACE 回顯服務器收到的請求,主要用于測試或診斷 ?? ??

說明:

  • 安全性 :不會改變資源狀態,可以理解為只讀的;

  • 冪等性 :執行1次和執行N次,對資源狀態改變的效果是等價的。

  • 查詢字段內容過多,統一使用POST方式查詢,請求地址增加/query加以區分

  • 批量刪除,統一使用POST方式,請求地址增加/delete加以區分

    由于存在批量刪除的情況,而一些網關、代理、防火墻在收到DELETE請求后,會把請求的body直接剝離掉。建議將存在批量刪除的接口統一改成POST提交,為了標識是刪除操作,在請求路徑上增加/delete。

GET

被用于獲取資源。不允許對服務器上資源做任何修改操作。

示例:

GET http://www.example.com/customers/12345
GET http://www.example.com/customers/12345/orders
GET http://www.example.com/buckets/sample

PUT

常用于更新資源。通過請求體攜帶資源發送給服務器。注意:在資源ID由客戶端而不是由服務器選擇的情況下,也可以使用PUT來創建資源。修改成功返回200,創建成功返回201。建議使用post進行創建新資源。

PUT http://www.example.com/customers/12345
PUT http://www.example.com/customers/12345/orders/98765
PUT http://www.example.com/buckets/secret_stuff

POST

常用于創建新資源。創建成功通常返回201。

POST http://www.example.com/customers
POST http://www.example.com/customers/12345/orders

DELETE

刪除資源。

DELETE http://www.example.com/customers/12345
DELETE http://www.example.com/customers/12345/orders
DELETE http://www.example.com/buckets/sample
HTTP Verb /customers /customers/{id}
GET 200 (OK),customers列表。 可用于分頁、排序、過濾。 200 (OK),單個customer。如果id不存在或非法,返回404 (NotFound)。
PUT 404 (Not Found),除非你想更新整個資源 200 (OK) 或者204 (No Content)。如果id不存在或非法,返回404 (NotFound)。
POST 201 (Created) 404 (Not Found)
DELETE 404 (Not Found),除非你想刪除整個資源 200 (OK) 。如果id不存在或非法,返回404 (NotFound)。

其他

  • 排序
    使用數組傳遞排序字段,-表示降序,無任何標識表示升序。

    sorts: ['-age', 'name']
    
  • 時間傳遞

    日期和時間戳如果沒有適當和一致地處理,可能是一個真正的頭痛。建議使用UTC或GMT時間存儲,處理,緩存等時間戳或者使用統一格式化的時間字符串”yyyy-MM-dd HH:mm:ss”

Respone

狀態碼

狀態碼 說明
200 OK 服務器成功返回請求的數據
201 CREATED 新建或修改數據成功
202 Accepted 表示一個請求已經進入后臺排隊(異步任務)
204 NO CONTENT 刪除數據成功
400 INVALID REQUEST 請求有錯誤,服務器沒有進行新建或修改數據的操作(冪等操作)
401 Unauthorized 沒有權限(令牌、用戶名、密碼錯誤)
403 Forbidden 得到授權(與401錯誤相對),但是訪問是被禁止的
404 NOT FOUND 請求記錄不存在,服務器沒有進行操作(冪等操作)
406 Not Acceptable 請求的格式不符合(比如用戶請求JSON格式,但是只有XML格式)
500 INTERNAL SERVER ERROR 服務器發生錯誤,無法判斷發出的請求是否成功

格式

  • 前后端交互字段全部使用小駝峰方式
{
  "code": "200", // HTTP響應碼(好多javascript框架并不會獲取http狀態碼,所以包裝到body中便于使用)
  "status": "success/fail/error", // 見下述表格
  "content/data": []/{}, // 多條記錄使用JSON數組,單條記錄使用JSON對象
  "message": []     // 狀態為error或fail時,對應的錯誤信息
}

status說明

狀態 說明
fail 返回碼為 500-599
error 返回碼為 400-499
success 其他狀態碼(1xx、2xx、3xx)

---------------------------------------------------------------------------分割線-----------------------------------------------------------

1.后端應考慮接口請方式,現在使用統一方式post

2.后端定義前端傳輸字段要符合駝峰命名如:storeName;見名知意;后臺返回字段也需符合駝峰命名

3.接口文檔對應字段應和后端返回一致(后端可以小心點)

4. 后臺返回數據字段需都在data里,不得在data之外;除與前端商定過

5. 后臺返回值為空時,需返回相對應的鍵名如:{listData: null} (鍵值為空時值null)

6. 接口功能獨立應分拆成新的接口

7. 返回字段須有msg,必須有值

{
   "code":200, // 1.成功為200, 2.其他非200
    "data": {
        "id":"1001",
        "name":"張三",
        "age":"20"
    },
    "msg":"成功", //  1.成功信息, 2其他返回對應信息 
}

示例

請求方式:POST

參數:說明

字段 類型 說明 必需
token string token信息
oldPwd string 舊密碼(hash)
newPwd string 新密碼(hash)

返回值:

字段 類型 說明 必需
code int 返回的狀態碼
data Object/Array 返回類型(值為空時返回null)
msg string 返回信息

示例1
正確的

{
   "code":200, // 1.成功為200, 2.其他非200
    "data": {
       "userInfo":{
           "id":null,   // 數據類型String,空時為null
            "name":"張三",
            "age":20 , // 數據類型為Number, 空時為null,
            "imgUrls": ['地址1', '地址2']  //類型Array, 空時為null
            "photoUrls": null
        },
      "level": :"領導"
    },
    "page":  {                //類型:Object  必有字段  備注:分頁信息
        "total":1,                //類型:Number  必有字段  備注:總條數
        "pages":1                //類型:Number  必有字段  備注:總頁數
    },
    "msg":"成功", //  1.成功信息, 2其他返回對應信息
}

錯誤的

{
   "code":200, // 1.成功為200, 2.其他非200
    "data": {
       "userInfo":{
          
        },
      "other":{
        "ohterIfno": "小李子"
      }
    },
    "level": "領導", // 錯誤格式
    "msg":"成功", //  1.成功信息, 2其他返回對應信息
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,533評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,055評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,365評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,561評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,346評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,889評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,978評論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,118評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,637評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,558評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,739評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,246評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,980評論 3 346
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,362評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,619評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,347評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,702評論 2 370

推薦閱讀更多精彩內容

  • 去年有段時間得空,就把谷歌GAE的API權威指南看了一遍,收獲頗豐,特別是在自己幾乎獨立開發了公司的云數據中心之后...
    騎單車的勛爵閱讀 20,598評論 0 41
  • 前言 雖然一個api接口的業務,數據邏輯是后端提供的,但真正使用這個接口的是客戶端,一個前端功能的實現流程與邏輯,...
    Snapeliu閱讀 2,987評論 1 14
  • 前言 兵馬未動,糧草先行。在一款APP產品的各個版本迭代中,兵馬的啟動指的是真正開始敲代碼的時候,糧草先行則是指前...
    listen2code閱讀 18,045評論 51 220
  • 作者:夫子音 【原文】: 性其總,合兩也;命其受,有則也;不極總之要,則不至受之分,盡性窮理而不可變,乃吾則也。天...
    泮溪秋玉閱讀 1,394評論 0 2
  • 有我微信的人都知道,我的微信頭像始終是這個,一直舍不得換掉,朋友,一直在我身邊是特別重要的存在,我的朋友都懂我,心...
    仲夏的寒冰閱讀 444評論 0 1