天天看點

restful api接口規範_RestFul的一些注意事項和接口開發規範

一、 URI

URI規範

1.不用大寫;

2.用中杠 - 不用下杠 _ ;

3.參數清單要encode;

4.URI中的名詞表示資源集合,使用複數形式。

5.在RESTful架構中,每個網址代表一種資源(resource),是以網址中不能有動詞,隻能有名詞(特殊情況可以使用動詞),而且所用的名詞往往與資料庫的表格名對應。

資源集合 vs單個資源

URI表示資源的兩種方式:資源集合、單個資源。

資源集合:

/zoos //所有動物園

/zoos/1/animals //id為1的動物園中的所有動物

單個資源:

/zoos/1//id為1的動物園

/zoos/1;2;3//id為1,2,3的動物園

避免層級過深的URI

在url中表達層級,用于 按實體關聯關系進行對象導航 ,一般根據id導航。

過深的導航容易導緻url膨脹,不易維護,如 GET /zoos/1/areas/3/animals/4 ,盡量使用查詢參數代替路徑中的實體導航,如 GET/animals?zoo=1&area=3 ;

二、 版本

應該将API的版本号放入到URI中

https://api.example.com/v1/zoos

三、 Request

HTTP方法

通過标準HTTP方法對資源CRUD:

GET:查詢(從伺服器取出資源一項或多項)

GET /zoos

GET /zoos/1

GET/zoos/1/employees

POST:建立單個新資源。 POST一般向“資源集合”型uri發起

POST/animals //新增動物

POST/zoos/1/employees //為id為1的動物園雇傭員工

PUT:更新單個資源(全量),用戶端提供完整的更新後的資源。與之對應的是 PATCH,PATCH負責部分更新,用戶端提供要更新的那些字段。 PUT/PATCH一般向“單個資源”型uri發起

PUT/animals/1

PUT /zoos/1

DELETE:删除

DELETE/zoos/1/employees/2

DELETE/zoos/1/employees/2;4;5

DELETE/zoos/1/animals //删除id為1的動物園内的所有動物

HEAD / OPTION/ PATCH用的不多,就不多解釋了。

HEAD:擷取資源的中繼資料

OPTIONS:擷取資訊,關于資源的哪些屬性是用戶端可以改變的

PATCH:在伺服器更新資源(用戶端提供改變的屬性)

安全性和幂等性

1. 安全性 :不會改變資源狀态,可以了解為隻讀的;

2. 幂等性 :執行1次和執行N次,對資源狀态改變的效果是等價的。

restful api接口規範_RestFul的一些注意事項和接口開發規範

安全性和幂等性均不保證反複請求能拿到相同的response。以 DELETE為例,第一次DELETE傳回200表示删除成功,第二次傳回404提示資源不存在,這是允許的。

複雜查詢

查詢可以捎帶以下參數:

restful api接口規範_RestFul的一些注意事項和接口開發規範

Bookmarker

經常使用的、複雜的查詢标簽化,降低維護成本。

如:GET /trades?status=closed&sort=created,desc

快捷方式:GET /trades#recently-closed或者GET /trades/recently-closed

狀态碼

伺服器向使用者傳回的狀态碼和提示資訊,常見的有以下一些(方括号中是該狀态碼對應的HTTP動詞)。

§200 OK - [GET]:伺服器成功傳回使用者請求的資料,該操作是幂等的(Idempotent)。

§201 CREATED - [POST/PUT/PATCH]:使用者建立或修改資料成功。

§202 Accepted - [*]:表示一個請求已經進入背景排隊(異步任務)

§204 NO CONTENT - [DELETE]:使用者删除資料成功。

§400 INVALID REQUEST - [POST/PUT/PATCH]:使用者發出的請求有錯誤,伺服器沒有進行建立或修改資料的操作,該操作是幂等的。

§401 Unauthorized - [*]:表示使用者沒有權限(令牌、使用者名、密碼錯誤)。

§403 Forbidden - [*] 表示使用者得到授權(與401錯誤相對),但是通路是被禁止的。

§404 NOT FOUND - [*]:使用者發出的請求針對的是不存在的記錄,伺服器沒有進行操作,該操作是幂等的。

§406 Not Acceptable - [GET]:使用者請求的格式不可得(比如使用者請求JSON格式,但是隻有XML格式)。

§410 Gone -[GET]:使用者請求的資源被永久删除,且不會再得到的。

§422 Unprocesable entity - [POST/PUT/PATCH] 當建立一個對象時,發生一個驗證錯誤。

§500 INTERNAL SERVER ERROR - [*]:伺服器發生錯誤,使用者将無法判斷發出的請求是否成功。

URI失效

随着系統發展,總有一些API失效或者遷移,對失效的API,傳回404 not found 或 410 gone;對遷移的API,傳回 301重定向。

四、Response

1. 不要包裝:

response的 body 直接就是資料,不要做多餘的包裝。錯誤示例:

{

"success":true,

"data":{"id":1,"name":"xiaotuan"},

}

2. 各HTTP方法成功處理後的資料格式:

restful api接口規範_RestFul的一些注意事項和接口開發規範

五、錯誤處理

1. 不要發生了錯誤但給2xx響應,用戶端可能會緩存成功的http請求;

2. 正确設定http狀态碼,不要自定義;

3. Response body提供

即:傳回的資訊中将error作為鍵名,出錯資訊作為鍵值即可

1)錯誤的代碼(日志/問題追查);

2)錯誤的描述文本(展示給使用者)。

對第三點的實作稍微多說一點:

Java伺服器端一般用異常表示 RESTful API的錯誤。API 可能抛出兩類異常:業務異常和非業務異常。 業務異常 由自己的業務代碼抛出,表示一個用例的前置條件不滿足、業務規則沖突等,比如參數校驗不通過、權限校驗失敗。 非業務類異常 表示不在預期内的問題,通常由類庫、架構抛出,或由于自己的代碼邏輯錯誤導緻,比如資料庫連接配接失敗、空指針異常、除0錯誤等等。

業務類異常必須提供2種資訊:

1. 如果抛出該類異常,HTTP響應狀态碼應該設成什麼;

2. 異常的文本描述;

在Controller層使用統一的異常攔截器:

1. 設定 HTTP響應狀态碼:對業務類異常,用它指定的 HTTPcode;對非業務類異常,統一500;

2. Response Body的錯誤碼:異常類名

3. Response Body的錯誤描述:對業務類異常,用它指定的錯誤文本;對非業務類異常,線上可以統一文案如“伺服器端錯誤,請稍後再試”,開發或測試環境中用異常的 stacktrace,伺服器端提供該行為的開關。

常用的http狀态碼及使用場景:

restful api接口規範_RestFul的一些注意事項和接口開發規範

六、其他

(1)API的身份認證應該使用OAuth2.0架構

(2)伺服器傳回的資料格式,應該盡量使用JSON,避免使用XML

(3)比較複雜的接口不能确定是使用POST還是PUT時,要看具體的業務層代碼,看看接口産生的結果是否幂等,如果幂等用PUT,相反用POST

如:接口接收到一資源,資源存在更新,不存在插入新資料,這個接口就要用PUT

以上内容希望幫助到大家,更多PHP大廠PDF面試文檔,PHP進階架構視訊資料,PHP精彩好文可以關注公衆号:PHP開源社群,或者通路:

四年精華PHP技術文章整理合集——PHP架構篇

四年精華PHP技術文合集——微服務架構篇

四年精華PHP技術文合集——分布式架構篇

四年精華PHP技術文合集——高并發場景篇

四年精華PHP技術文章整理合集——資料庫篇

繼續閱讀