REST
- REST是REpresentationsal State Transfer的縮寫,具象狀態轉換
- RESTful是一種開發理念,是一種API設計風格,而不是標準
主要的規範
- 每一個URL代表一種資源,具體要對資源進行什麼操作,是根據請求方式來區分的,而不是在URL上直接體現:
GET http://www.xxx.com/get_user/01
(不安全、繁瑣、難維護等弊端),可以設計成GET http://www.xxx.com/user/01
- 後端返回的資源數據類型有:
- json格式數據
- text文本
- 圖片、視頻等
- 客戶端和服務器之間,傳遞這種資源的某種表現形式
- 後端通過請求頭
Content-Type
來指明傳給服務端的參數類型,比如application/json
- 後端通過請求頭中
Accept
來指明希望後端返回的相應數據的類型,比如application/json
- 後端通過請求頭
- 客戶端通過請求方式的不同,指明對服務器資源進行不同的操作
- GET:read
- POST:create
- PUT:update/replace
- PATCH:partial/update/modify
- DELETE:delete
REST常用的設計規範
一、URL
1. 命名
- 儘量使用名詞複數形式,儘量不要使用動詞
- 往往與數據庫的表名對應
差的設計:
好的設計:
2. 過濾條件
如果記錄數量很多,則需添加條件進行限制,否則返回數據太多,影響性能
?limit = 10 # 指定返回記錄的數量
?offset = 10 # 指定返回記錄的開始位置
?currPage=2&pageSize=10 # 指定第幾頁和每頁多少條數據
?sort=name # 指定返回結果按照指定的屬性進行排序
3.域名
- 儘量使用專用域名
http://api.wwj.com
4.版本號
- 在url中呈現版本號
http://xxx/app/1.0/
http://xxx/app/1.1/
- 也可以在請求頭呈現
Accept:application/vnd.example.v1.0+json
Accept:application/vnd.example.v1.1+json;version=1.1
二、請求方式/動詞
- 常見的http請求(括號中對應的sql命令)
GET(select)
: 從服務器獲取資源(一個或多個)
POST(create)
: 在服務器創建一個資源
PUT(update)
: 在服務器更新資源(客戶端提供所要更新的完整資源,比如要更新user的age,但如果是put,需要提供user的全部數據)
DELETE(delete)
: 從服務器刪除資源 - 下面是不常見的三種
PATCH(update where):在服務器進行部分資源的更新(客戶端提供改變的屬性)
HEAD:獲取資源的元數據
OPTIONS:獲取關於資源的哪些屬性是客戶端可以改變的信息,一般 後面會跟其它常用請求
例子(很重要)
GET /projects # 獲取所有項目信息
POST /projects # 創建一個新項目
GET / projects/6 # 獲取id=6的項目信息
PUT /projects/6 # 更新id=6的項目信息(全更新)
PATCH /projects/6 # 更新id=6的項目信息(部分更新)
DELETE /projects/6 # 刪除id=6的項目
''' 多層級信息的獲取的設計 '''
GET /projects/6/interfaces # 獲取id=6的項目信息中所有的接口信息
GET /projects/6/interfaces/1 #獲取id=6的項目信息中id=1的接口信息
三、常見狀態碼(RESTful)
Status Codes
200 ok - [GET]: 服務器成功返回用戶請求的數據
201 CREATED - [POST/PUT/PATCH]: 用戶創建成功或修改數據成功
204 NO CONTENT - [DELETE]: 用戶刪除數據成功
400 INVALID REQUEST - [POST/PUT/PATCH]:用戶請求有誤(請求參數有問題)
401 Unauthorized = [^] : 表示用戶沒有權限(cookies、用戶名、密碼錯誤)
403 Forbidden - [^]: 表示用戶得到授權(和401錯誤相對),但是訪問是禁止的
404 NOT FOUND - [^]: 表示用戶請求的路徑不存在
500 INTERNAL SERVER ERROR - [^]: 服務器發生錯誤
四、錯誤處理
當請求有誤時,服務器需將錯誤信息以json的格式返回,比如:
{
"code":1001,
"data":null,
"msg":"用戶不存在"
}
五、超鏈接API
響應數據中,可以包含下一步操作的url鏈接(比如說上一頁、下一頁的鏈接字段)