今天,我們將討論一些可遵循的最佳實踐。我們將保持簡短和甜蜜——所以系好安全帶,出發(fā)咯!
首先介紹一些術語
資源:資源是數(shù)據(jù)的一部分,例如:用戶
集合:一組資源稱為集合,例如:用戶列表
URL:標識資源或集合的位置,例如:/user
/systemOrders或/system_orders
/system-orders
例如,如果你想從一個特定的商店購買產品。
/system-orders/{order_id}
/system-orders/{OrderId}
/system-orders/{orderId}
如果你想獲得系統(tǒng)的所有用戶。
GET /user
GET /User
GET /users
如果要保持概念的單一性和一致性。
GET /shops/:shopId/category/:categoryId/price
GET /shops/:shopId/或GET /category/:categoryId
POST /updateuser/{userId}
GET /getusers
PUT /user/{userId}
如果你有一個端點,它只返回一個操作。在這種情況下,你可以使用動詞。例如,如果你想要向用戶重新發(fā)送警報。
POST /alarm/245743/resend
如果你正在構建一個請求體或響應體為JSON的系統(tǒng),那么屬性名應該使用駝峰大小寫。
{ user_name: "Mohammad Faisal" user_id: "1"}
{ userName: "Mohammad Faisal" userId: "1"}
product_order
product-orders
API藍圖:https://apiblueprint.org/
Swagger:https://swagger.io/
始終對API使用版本控制,并將其向左移動,使其具有最大的作用域。版本號應該是v1,v2等等。
如果API返回一個對象列表,則響應中總是包含資源的總數(shù)。你可以為此使用total屬性。
{ users: [ ... ]}
{ users: [ ... ], total: 34}
GET /shops?offset=5&limit=5
GET /shops?fields=id,name,address,contact
這是一種非常糟糕的做法,因為url經(jīng)常被記錄,而身份驗證令牌也會被不必要地記錄。
GET /shops/123?token=some_kind_of_authenticaiton_token
Authorization: Bearer xxxxxx, Extra yyyyy
服務器不應該假定內容類型。例如,如果你接受application/x-www-form-urlencoded,那么攻擊者可以創(chuàng)建一個表單并觸發(fā)一個簡單的POST請求。
content-type: application/json
HTTP方法用于解釋CRUD功能。
GET /shops/2/products:從shop 2獲取所有產品的列表。
GET /shops/2/products/31:獲取產品31的詳細信息,產品31屬于shop 2。
DELETE /shops/2/products/31:應該刪除產品31,它屬于商店2。
PUT /shops/2/products/31:應該更新產品31的信息,只在resource-URL上使用PUT,而不是集合。
POST /shops:應該創(chuàng)建一個新的商店,并返回創(chuàng)建的新商店的詳細信息。在集合url上使用POST。
一定要為所有面向公共的API支持CORS(跨源資源共享)頭部。
當客戶端向服務發(fā)出無效或不正確的請求,或向服務傳遞無效或不正確的數(shù)據(jù),而服務拒絕該請求時,就會出現(xiàn)錯誤,或者更具體地說,出現(xiàn)服務錯誤。
當由于一個或多個服務錯誤而拒絕客戶端請求時,一定要返回4xx HTTP錯誤代碼。
考慮處理所有屬性,然后在單個響應中返回多個驗證問題。
如果您對API格式的決定有疑問,這些黃金規(guī)則可以幫助我們做出正確的決定。
扁平比嵌套好。
簡單勝于復雜。
字符串比數(shù)字好。
一致性比定制更好。
希望你度過美好的一天!
譯者:Mr.lzc,軟件工程師、DevOpsDays、HDZ深圳核心組織者,目前供職于華為,從事云計算工作,專注于K8s、微服務領域。