国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
REST接口

文章來源

REST 對請求的約定

REST 用來規(guī)范應用如何在 HTTP 層與 API 提供方進行數(shù)據(jù)交互 。

REST 描述了 HTTP 層里客戶端和服務器端的數(shù)據(jù)交互規(guī)則;客戶端通過向服務器端發(fā)送 HTTP(s)請求,接收服務器的響應,完成一次 HTTP 交互。這個交互過程中,REST 架構(gòu)約定兩個重要方面就是 HTTP 請求的所采用方法,以及請求的鏈接。

在請求層面,REST 規(guī)范可以簡單粗暴抽象成以下兩個規(guī)則:

  1. 請求 API 的 URL 表示用來定位資源;
  2. 請求的 METHOD 表示對這個資源進行的操作;

API的URL

URL 用來定位資源,跟要進行的操作區(qū)分開,這就意味這 URL 不該有任何動詞;

下面示例中的 get、create、search 等動詞,都不應該出現(xiàn)在 REST 架構(gòu)的后端接口路徑中。在以前,這些接口中的動名詞通常對應后臺的某個函數(shù)。比如:

/api/getUser/api/createApp/api/searchResult/api/deleteAllUsers
  • 1
  • 2
  • 3
  • 4

當我們需要對單個用戶進行操作時,根據(jù)操作的方式不同可能需要下面的這些接口:

/api/getUser (用來獲取某個用戶的信息,還需要以參數(shù)方式傳入用戶 id 信息)/api/updateUser (用來更新用戶信息)/api/deleteUser (用來刪除單個用戶)/api/resetUser (重置用戶的信息)
  • 1
  • 2
  • 3
  • 4

更有甚者,可能在更新用戶不同信息時,提供不同的接口,比如:

/api/updateUserName/api/updateUserEmail/api/updateUser
  • 1
  • 2
  • 3

這樣的弊端在于:首先加上了動詞,肯定是使 URL 更長了;其次對一個資源實體進行不同的操作就是一個不同的 URL,造成 URL 過多難以管理。

其實當你回過頭看「URL」 這個術語的定義時,更能理解這一點。URL 的意思是統(tǒng)一資源定位符,這個術語已經(jīng)清晰的表明,一個 URL 應該用來定位資源,而不應該摻入對操作行為的描述。

在 REST 架構(gòu)的鏈接應該是這個樣子:
1. URL 中不應該出現(xiàn)任何表示操作的動詞,鏈接只用于對應資源;
2. URL 中應該單復數(shù)區(qū)分,推薦的實踐是永遠只用復數(shù);比如 GET /api/users 表示獲取用戶的列表;如果獲取單個資源,傳入 ID,比如 /api/users/123 表示獲取單個用戶的信息;
3. 按照資源的邏輯層級,對 URL 進行嵌套,比如一個用戶屬于某個團隊,而這個團隊也是眾多團隊之一;那么獲取這個用戶的接口可能是這樣:

GET /api/teams/123/members/234 表示獲取 id 為 123 的小組下,id 為234 的成員信息
  • 1

按照類似的規(guī)則,可以寫出如下的接口:

/api/teams (對應團隊列表)/api/teams/123 (對應 ID 為 123 的團隊)/api/teams/123/members (對應 ID 為 123 的團隊下的成員列表)/api/teams/123/members/456 (對應 ID 為 123 的團隊下 ID 為 456 的成員)
  • 1
  • 2
  • 3
  • 4

API的請求方法

在很多系統(tǒng)中,幾乎只用 GET 和 POST 方法來完成了所有的接口操作;這個行為類似于全用 DIV 來布局。實際上,我們不只有GET 和 POST 可用,在 REST 架構(gòu)中,有以下幾個重要的請求方法:GET,POST,PUT,PATCH,DELETE。這幾個方法都可以與對數(shù)據(jù)的 CRUD 操作對應起來。

CRUD 是指在做計算處理時的增加(Create)、讀取查詢(Retrieve)、更新(Update)和刪除(Delete)幾個單詞的首字母簡寫。即增刪改查

【Read】,資源的讀取,用 GET 請求;比如:
GET /api/users  ( 表示讀取用戶列表)
  • 1

GET 應當實現(xiàn)為一個安全方法。用于獲取數(shù)據(jù)而不應該產(chǎn)生副作用。

【Created】,資源的創(chuàng)建,用 POST 方法;

POST 是一個非冪等的方法,多次調(diào)用會造成不同效果;

冪等(Idempotent):如果對服務器資源的多次請求與一次請求造成的副作用是一樣的的話,那這個請求方法可以被認為是冪等。

比如下面的請求會在服務器上創(chuàng)建一個 name 屬性為 ‘John Snow’ 的用戶;多次請求就會創(chuàng)建多個這樣的用戶。

POST /api/users{  "name": "John Snow"}
  • 1
  • 2
  • 3
  • 4
【Update】,資源的更新。用于更新的 HTTP 方法有兩個,PUT 和 PATCH。

他們都應當被實現(xiàn)為冪等方法,即多次同樣的更新請求應當對服務器產(chǎn)生同樣的副作用。

PUT 和 PATCH 有各自不同的使用場景:

PUT 用于更新資源的全部信息,在請求的 body 中需要傳入修改后的全部資源主體;

而 PATCH 用于局部更新,在 body 中只需要傳入需要改動的資源字段。

設想服務器中有以下用戶資源 /api/users/123

{ "id": 123, "name": "Original", "age": 20}
  • 1
  • 2
  • 3
  • 4
  • 5

當我們往后臺發(fā)送更新請求時,PATCH 和 PUT 造成的效果是不一樣。

PUT /api/users/123{ "name": "PUT Update"}
  • 1
  • 2
  • 3
  • 4

上述 PUT 請求操作后的內(nèi)容是:

{ "id": 123, "name": "PUT Update"}
  • 1
  • 2
  • 3
  • 4

可以觀察到,資源原有的 age 字段被清除掉了。

而如果改用 PATCH 的話,

PATCH /api/users/123{ "name": "PATCH Update"}
  • 1
  • 2
  • 3
  • 4

更新后的內(nèi)容是:

{ "id": 123, "name": "PATCH Update", "age": 20}
  • 1
  • 2
  • 3
  • 4
  • 5

請求中指定的 name 屬性被更新了,而原有的 age 屬性則保持不變。

PATCH 的作用在于如果一個資源有很多字段,在進行局部更新時,只需要傳入需要修改的字段即可。否則在用 PUT 的情況下,你不得不將整個資源模型全都發(fā)送回服務器,造成網(wǎng)絡資源的極大浪費。

【Delete】,資源的刪除,相應的請求 HTTP 方法就是 DELETE。這個也應當被實現(xiàn)為一個冪等的方法。如:
DELETE /api/users/123
  • 1

用于刪除服務器上 ID 為 123 的資源,多次請求產(chǎn)生副作用都是,是服務器上 ID 為 123 的資源不存在。

還有兩個不常用的HTTP動詞
  • HEAD:獲取資源的元數(shù)據(jù)。
  • OPTIONS:獲取信息,關于資源的哪些屬性是客戶端可以改變的。

分頁、過濾(接受參數(shù))

REST 風格的接口地址,表示的可能是單個資源,也可能是資源的集合;當我們需要訪問資源集合時,設計良好的接口應當接受參數(shù),允許只返回滿足某些特定條件的資源列表。

比如支持以 offset 和 limit 參數(shù)來進行分頁;

GET /api/users?offset=0&limit=20
  • 1

支持提供關鍵詞進行搜索,以及排序

GET /api/users?keyword=john&sort=age
  • 1

支持根據(jù)字段進行過濾:

GET /api/users?gender=male
  • 1

設計合適的 API URL,以及選擇合適的請求方法,可以語義化的描述一個 HTTP 請求的操作。

當我們都熟悉且遵循這樣的規(guī)范后,基本可以看到一個 REST 風格的接口就知道如何使用這個接口進行 CRUD 操作了。比如下面這面這個接口就表示搜索 ID 為 123 的圖書館的書,并且書的信息里包含關鍵字「game」,返回前十條滿足條件的結(jié)果。

GET /api/libraries/123/books?keyword=game&sort=price&limit=10&offset=0
  • 1

同樣,下面這個請求的意思也就很明顯了吧。

PATCH /api/companies/123/employees/234{    "salary": 2300}
  • 1
  • 2
  • 3
  • 4

狀態(tài)碼

服務器向用戶返回的狀態(tài)碼和提示信息,常見的有以下一些(方括號中是該狀態(tài)碼對應的HTTP動詞)。

  • 200 OK - [GET]:服務器成功返回用戶請求的數(shù)據(jù),該操作是冪等的(Idempotent)。
  • 201 CREATED - [POST/PUT/PATCH]:用戶新建或修改數(shù)據(jù)成功。
  • 202 Accepted - [*]:表示一個請求已經(jīng)進入后臺排隊(異步任務)
  • 204 NO CONTENT - [DELETE]:用戶刪除數(shù)據(jù)成功。
  • 400 INVALID REQUEST - [POST/PUT/PATCH]:用戶發(fā)出的請求有錯誤,服務器沒有進行新建或修改數(shù)據(jù)的操作,該操作是冪等的。
  • 401 Unauthorized - [*]:表示用戶沒有權(quán)限(令牌、用戶名、密碼錯誤)。
  • 403 Forbidden - [*] 表示用戶得到授權(quán)(與401錯誤相對),但是訪問是被禁止的。
  • 404 NOT FOUND - [*]:用戶發(fā)出的請求針對的是不存在的記錄,服務器沒有進行操作,該操作是冪等的。
  • 406 Not Acceptable - [GET]:用戶請求的格式不可得(比如用戶請求JSON格式,但是只有XML格式)。
  • 410 Gone -[GET]:用戶請求的資源被永久刪除,且不會再得到的。
  • 422 Unprocesable entity - [POST/PUT/PATCH] 當創(chuàng)建一個對象時,發(fā)生一個驗證錯誤。
  • 500 INTERNAL SERVER ERROR - [*]:服務器發(fā)生錯誤,用戶將無法判斷發(fā)出的請求是否成功。

錯誤處理

如果狀態(tài)碼是4xx,就應該向用戶返回出錯信息。一般來說,返回的信息中將error作為鍵名,出錯信息作為鍵值即可。

{    error: "Invalid API key"}
  • 1
  • 2
  • 3

返回結(jié)果

針對不同操作,服務器向用戶返回的結(jié)果應該符合以下規(guī)范。

  • GET /collection:返回資源對象的列表(數(shù)組)
  • GET /collection/resource:返回單個資源對象
  • POST /collection:返回新生成的資源對象
  • PUT /collection/resource:返回完整的資源對象
  • PATCH /collection/resource:返回完整的資源對象
  • DELETE /collection/resource:返回一個空文檔

Hypermedia API

RESTful API最好做到Hypermedia,即返回結(jié)果中提供鏈接,連向其他API方法,使得用戶不查文檔,也知道下一步應該做什么。

比如,當用戶向api.example.com的根目錄發(fā)出請求,會得到這樣一個文檔。

{"link": {  "rel":   "collection https://www.example.com/zoos",  "href":  "https://api.example.com/zoos",  "title": "List of zoos",  "type":  "application/vnd.yourformat+json"}}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

上面代碼表示,文檔中有一個link屬性,用戶讀取這個屬性就知道下一步該調(diào)用什么API了。rel表示這個API與當前網(wǎng)址的關系(collection關系,并給出該collection的網(wǎng)址),href表示API的路徑,title表示API的標題,type表示返回類型。

Hypermedia API的設計被稱為HATEOAS。Github的API就是這種設計,訪問api.github.com會得到一個所有可用API的網(wǎng)址列表。

{  "current_user_url": "https://api.github.com/user",  "authorizations_url": "https://api.github.com/authorizations",  // ...}
  • 1
  • 2
  • 3
  • 4
  • 5

從上面可以看到,如果想獲取當前用戶的信息,應該去訪問api.github.com/user , 然后就得到了下面結(jié)果。

{  "message": "Requires authentication",  "documentation_url": "https://developer.github.com/v3"}
  • 1
  • 2
  • 3
  • 4

其他

  1. API的身份認證應該使用OAuth 2.0框架。
  2. 服務器返回的數(shù)據(jù)格式,應該盡量使用JSON,避免使用XML。

關于 REST 的更多詳細規(guī)范,可以參考這個倉庫。

本站僅提供存儲服務,所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
技術圖文:Restful API 接口規(guī)范
REST風格的應用程序?qū)崿F(xiàn)
RESTful API 設計指南
REST簡介
優(yōu)秀REST風格 API的設計原則
接口測試 | 27 HTTP接口詳細驗證清單
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服