理解RESTful API

jopen 8年前發布 | 53K 次閱讀 API REST WEB服務/RPC/SOA

本博客采用創作共用版權協議, 要求署名、非商業用途和保持一致. 轉載本博客文章必須也遵循 署名-非商業用途-保持一致 的創作共用協議.

簡介

隨著Web開發的不斷開發, 低耦合的需求被提上了日程, 催生出了前后端分離的方案. 前后端分離使前端和服務器端相互獨立, 細化前后端開發, 于是近幾年API架構風行.

RESTful架構由 Roy Fielding 在一篇博士論文中提出. `REST, 即Representational State Transfer的縮寫, 中文可以譯為表現層狀態轉化

  • 表現層 可以理解為資源的表現層, 資源 在網絡通信中無處不在, 一段文本, 一張圖片, 一個文檔都是資源, JSON是現在最常用的資源表示格式 . (相對于資源, 數據是一種更加抽象的形式)
  • 狀態轉換 可以理解為客戶端發起的無狀態的HTTP請求, 導致服務器的資源的狀態轉變, 常用的五種HTTP動詞.
HTTP動詞 語意
GET 從服務器端獲取資源(冪等)
POST 在服務器新建資源
PUT 在服務器更新資源完整的資源(冪等)
PATCH 在服務器更新部分資源
DELETE 從服務器刪除資源(冪等)

冪等 : 在相同的數據和參數下,執行一次或多次產生的效果(副作用)是一樣的

設計

  • 只提供json作為返回格式
Content-Type:application/json; charset=utf-8
  • 資源 表示一種實體, 所以API設計時應該使用名詞, 動詞應該方法放在HTTP協議中
# GOOD
/api/member/(\d+)/status
GET: 從服務器換取用戶狀態
PATCH: 在服務器端更新用戶狀態
# BAD
/api/show/(\d+)/status

# GOOD
/api/message?from=1&to=2
# BAD
/api/message/(\d+)/to/(\d+)

# 獲取某用戶下的所有gist
GET /users/:username/gists
# 創建一個新的gist
POST /gists
# 刪除某個特定的gist
DELETE /gists/:id
# star某個gist
PUT /gists/:id/star
# 搜索, 參數q, sort, order
GET /search/repositories
# 獲取用戶資料
GET /api/member/(\d+)/info

# 解禁用戶
DELETE /api/member/(\d+)/status
#禁言用戶
PATCH /api/member/(\d+)/status

# 獲取用戶所有私信
GET /api/member/(\d+)/messages

# 獲取所有用戶的狀態
GET /api/members/status
  • 使用復數表示多個資源
# GOOD
/api/members/status

# BAD
/api/account
  • 過濾信息
# filtering 
GET /api/members?client_id=1
# Sorting
GET /api/members?sortby=created?=desc
# pagination
GET /api/members?page=1&per_page=50
GET /api/github/user/repos?page=2&per_page=100
  • 將API的版本號放入URL
# 掛起狀態
/api/member/status

# 只讀狀態
/api/member/status/v2
  • Authentication
  1. 基本認證機制
  2. Token認證機制
  3. OAuth
  • 增加頻率限制, 已認證的帳戶已用戶為單位, 未認證的賬戶以ip為單位
X-RateLimit-Limit:60
X-RateLimit-Remaining:56
X-RateLimit-Reset:1372700873

狀態碼

狀態碼 動詞 解釋
200 * 服務器成功返回用戶請求的數據
201 POST/PUT/PATCH 用戶新建或修改數據成功
202 * 表示一個請求已經進入后臺排隊(異步任務)
204 DELETE 用戶刪除數據成功
301 * 永久重定向
302 * 臨時重定向
400 POST/PUT/PATCH 用戶發出的請求有錯誤,服務器沒有進行新建或修改數據的操作
401 * 表示用戶沒有權限(令牌、用戶名、密碼錯誤)
403 * 表示用戶得到授權(與401錯誤相對),但是訪問是被禁止的
404 * 用戶發出的請求針對的是不存在的記錄,服務器沒有進行操作
406 GET 用戶請求的格式不可得(比如用戶請求JSON格式,但是只有XML格式)
410 GET 用戶請求的資源被永久刪除,且不會再得到的
422 POST/PUT/PATCH 當創建一個對象時,發生一個驗證錯誤
500 * 服務器發生錯誤,用戶將無法判斷發出的請求是否成功

注意事項

  1. 更新和創建應該返回一個資源描述, 防止API使用者為了獲取更新后的資源而再次調用該API
  2. 只返回JSON, 而不是XML
  3. 為了防止API濫用, 給API增加某種類型的速率限制(Github對驗證通過的用戶設置為每小時5000次)

參考鏈接

來自: http://andrewliu.in/2016/01/03/理解RESTful-API/

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!