一種軟件架構風格、設計風格,而不是標準,只是提供了一組設計原則和約束條件。它主要用於客戶端和服務器交互類的軟件。基於這個風格設計的軟件能夠更簡潔,更有層次,更易於實現緩存等機制。css
1.不用大寫;html
2.用中槓 - 不用下槓 _ ;python
3.參數列表要encode;mysql
4.URI中的名詞表示資源集合,使用複數形式。sql
5.在RESTful架構中,每一個網址表明一種資源(resource),因此網址中不能有動詞,只能有名詞(特殊狀況可使用動詞),並且所用的名詞每每與數據庫的表格名對應。數據庫
URI表示資源的兩種方式:資源集合、單個資源。編程
資源集合:api
/zoos //全部動物園緩存
/zoos/1/animals //id爲1的動物園中的全部動物安全
單個資源:
/zoos/1//id爲1的動物園
/zoos/1;2;3//id爲1,2,3的動物園
在url中表達層級,用於 按實體關聯關係進行對象導航 ,通常根據id導航。
過深的導航容易致使url膨脹,不易維護,如 GET /zoos/1/areas/3/animals/4 ,儘可能使用查詢參數代替路徑中的實體導航,如 GET/animals?zoo=1&area=3 ;
應該將API的版本號放入到URI中
https://api.example.com/v1/zoos
經過標準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次,對資源狀態改變的效果是等價的。
. |
安全性 |
冪等性 |
GET |
√ |
√ |
POST |
× |
× |
PUT |
× |
√ |
DELETE |
× |
√ |
安全性和冪等性均不保證反覆請求能拿到相同的response。以 DELETE爲例,第一次DELETE返回200表示刪除成功,第二次返回404提示資源不存在,這是容許的。
複雜查詢
查詢能夠捎帶如下參數:
. |
示例 |
備註 |
過濾條件 |
?type=1&age=16 |
容許必定的uri冗餘,如 /zoos/1 與 /zoos?id=1 |
排序 |
?sort=age&order=asc |
指定返回結果按照哪一個屬性排序,以及排序順序 |
投影 |
?whitelist=id,name,email |
|
分頁 |
? page=2&per_page=100 |
指定第幾頁,以及每頁的記錄數 |
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的 body 直接就是數據,不要作多餘的包裝。錯誤示例:
{
"success":true,
"data":{"id":1,"name":"xiaotuan"},
}
2. 各HTTP方法成功處理後的數據格式:
· |
response 格式 |
GET |
單個對象、集合 |
POST |
新增成功的對象 |
PUT/PATCH |
更新成功的對象 |
DELETE |
空 |
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狀態碼及使用場景:
狀態碼 |
使用場景 |
400 bad request |
經常使用在參數校驗 |
401 unauthorized |
未經驗證的用戶,常見於未登陸。若是通過驗證後依然沒權限,應該 403(即 authentication和 authorization的區別)。 |
403 forbidden |
無權限 |
404 not found |
資源不存在 |
500 internal server error |
非業務類異常 |
503 service unavaliable |
由容器拋出,本身的代碼不要拋這個異常 |
(1)API的身份認證應該使用OAuth2.0框架
(2)服務器返回的數據格式,應該儘可能使用JSON,避免使用XML
(3)比較複雜的接口不能肯定是使用POST仍是PUT時,要看具體的業務層代碼,看看接口產生的結果是否冪等,若是冪等用PUT,相反用POST
如:接口接收到一資源,資源存在更新,不存在插入新數據,這個接口就要用PUT
參考:https://blog.csdn.net/u013731455/article/details/56278168
restful 規範 1. 根據method不一樣,進行不一樣操做 GET/POST/PUT/DELETE/PATCH 2. 面向資源編程 http://www.nnblog.com/blog 3. 體現版本 http://www.nnblog.com/v1/blog http://www.nnblog.com/v2/blog https://v4.bootcss.com/ https://v3.bootcss.com/ 4. 體現是API http://www.nnblog.com/api/v1/blog http://www.nnblog.com/api/v2/blog http://api.nnblog.com/v1/salary http://api.luffycity.com/v2/blog 5. https https://www.nnblog.com/api/v1/blog https://www.nnblog.com/api/v2/blog 6. 響應式設置狀態碼 200 300 400 500 return HttpResponse('adfasdf',status=300) 7. 條件 https://www.nnblog.com/api/v2/blog?page=1&size=10 8. 返回值 https://www.nnblog.com/api/v2/salary GET: 全部列表 { code: 10000, data: [ {'id':1,'title':'a'}, {'id':1,'title':'b'}, {'id':1,'title':'c'}, ] } POST: 返回新增的數據 {'id':1,'title':'高亮'} https://www.nnblog.com/api/v2/salary/1/ GET: 獲取單條數據 {'id':1,'title':'d'} PUT:更新 {'id':1,'title':'e'} PATCH: 局部更新 {'id':1,'title':'f'} DELETE:刪除 9. 返回錯誤信息 { code: 100001, error: 'xxx錯誤' } 10. Hypermedia API ret = { code: 1000, data:{ id:1, name:'付勇', depart_id:http://www.nnblog.com/api/v1/blog/8/ } }