Java开发RESTful(三)RESTful设计
【原創(chuàng)文章,轉(zhuǎn)載請注明原文章地址,謝謝!】
摘要,本文主要是簡單討論RESTful的相關(guān)設(shè)計問題,包括資源設(shè)計,動作設(shè)計和響應(yīng)設(shè)計。
資源設(shè)計
在本系列第一篇文章中已經(jīng)通過一個優(yōu)惠券的例子給大家簡單闡述了一下資源的設(shè)計,包括二級資源的設(shè)計。下面我們來看下詳細的資源設(shè)計方案:
前面我們已經(jīng)了解到,在RESTful架構(gòu)中,每個網(wǎng)址代表一種資源(resource),所以網(wǎng)址中不能有動詞,只能有名詞,而且所用的名詞往往與數(shù)據(jù)庫的表格名對應(yīng)。一般來說,數(shù)據(jù)庫中的表都是同種記錄的”集合”(collection),所以API中的名詞也應(yīng)該使用復(fù)數(shù)。
例如,針對一個動物園應(yīng)用,可能涉及到的資源就應(yīng)該有:
https://api.example.com/v1/zoos:動物園資源
https://api.example.com/v1/animals:動物資源
https://api.example.com/v1/employees:飼養(yǎng)員資源
注意設(shè)計的方案,最后一個單詞都是名詞并且都是復(fù)數(shù)。對于簡單的應(yīng)用來說,一般一個資源就對應(yīng)一個表,這樣的設(shè)計已經(jīng)足夠。但是更多的情況,面對復(fù)雜的應(yīng)用,因為HTTP提供的接口是有限的(HTTP一共就提供了常用的5種請求方式,所以能表示的對一個資源的操作是有限的)怎么抽取出合適的資源,也是一個相對來說比較困難的事情。這個在我們后面的實戰(zhàn)示例中會提到。
動作設(shè)計
先來看看REST中針對HTTP常用動作的一些固定的含義:
- GET(SELECT):表示從服務(wù)器取出資源(一項或多項)。
- POST(CREATE):表示在服務(wù)器新建一個資源。
- PUT(UPDATE):表示在服務(wù)器更新資源(客戶端需要提供改變后的完整資源)。
- PATCH(UPDATE):表示在服務(wù)器更新資源(客戶端需要提供改變的屬性【可以簡單理解為補丁】)。
- DELETE(DELETE):表示從服務(wù)器刪除資源。
以上五個是最常用的請求方式;另外還有兩個:
- HEAD:獲得一個資源的元數(shù)據(jù),比如一個資源的hash值或者最后修改日期;
- OPTIONS:獲得客戶針對一個資源能夠?qū)嵤┑牟僮?#xff1b;這個主要是作為Hypermedia 存在(在最佳實踐中介紹)
下面列幾個簡單的動作示例,示例格式 HTTP動作 URL:說明
- GET /zoos:列出所有動物園
- POST /zoos:新建一個動物園
- GET /zoos/ID:獲取某個指定動物園的信息(ID即指定動物園id)
- PUT /zoos/ID:更新某個指定動物園的信息(瀏覽器端需要提供該動物園的全部信息)
- PATCH /zoos/ID:更新某個指定動物園的信息(瀏覽器端需要提供該動物園的部分信息)
- DELETE /zoos/ID:刪除某個動物園
- GET /zoos/ID/animals:列出某個指定動物園的所有動物(animals為二級資源路徑)
- DELETE /zoos/ID/animals/ID:刪除某個指定動物園的指定動物animals為二級資源路徑,前面一個id是指定動物園id,后面一個id是指定動物id)
返回結(jié)果
返回結(jié)果也是HTTP協(xié)議中非常重要的組成部分,客戶端完全通過返回結(jié)果來斷定請求的結(jié)果,包括異常等。
返回值類型
即針對不同的請求方式,應(yīng)該返回什么標(biāo)準(zhǔn)的內(nèi)容。但是注意,具體返回什么樣式的內(nèi)容,是通過頭信息來規(guī)定的。下面直接使用一些案例來說明:
- GET /collection:規(guī)定返回資源對象的列表(數(shù)組)
- GET /collection/resource:規(guī)定返回單個資源對象
- POST /collection:規(guī)定返回新生成的資源對象
- PUT /collection/resource:規(guī)定返回完整的資源對象
- PATCH /collection/resource:規(guī)定返回完整的資源對象
- DELETE /collection/resource:規(guī)定返回一個空文檔
Content Type
一個API可以允許返回JSON,XML甚至HTML等文檔格式;具體的文檔格式由頭信息規(guī)定。而頭信息來源于兩點,一個是請求頭中的Accept Type,表示客戶端需要請求的表現(xiàn)層數(shù)據(jù)格式。一個是響應(yīng)頭中的Content Type,表示本次請求服務(wù)器端返回的數(shù)據(jù)格式。
另外,完全也可以通過URI后綴來表示請求格式,比如GET /animals.json用來表示請求json格式的動物列表數(shù)據(jù),使用GET /animals.xml來表示請求XML格式的動物列表數(shù)據(jù),但是更建議使用請求頭來表示,不要把數(shù)據(jù)類型和資源混淆。
返回狀態(tài)碼
返回狀態(tài)碼在HTTP/1.1協(xié)議中是一個非常重要的概念。表示了本次請求的一個最終的效果,也是客戶端判定本次請求結(jié)果的第一個入口。返回狀態(tài)碼非常多,下面簡單列舉了常用的返回狀態(tài)碼說明(格式:狀態(tài)碼 狀態(tài)碼說明 適合的請求類型:解釋):
- 200 OK - [GET]:服務(wù)器成功返回用戶請求的數(shù)據(jù)。
- 201 CREATED - [POST/PUT/PATCH]:用戶新建或修改數(shù)據(jù)成功(但是大部分情況下,使用200也是可以的)。
- 202 Accepted - [*]:表示一個請求已經(jīng)進入后臺排隊(針對異步請求,或者后臺服務(wù)需要一定處理時間的請求)
- 204 NO CONTENT - [DELETE]:用戶刪除數(shù)據(jù)成功(但是大部分情況下,使用200也是可以的)。
- 400 INVALID REQUEST - [POST/PUT/PATCH]:用戶發(fā)出的請求有錯誤,服務(wù)器沒有進行新建或修改數(shù)據(jù)的操作,該操作是冪等(冪等的意思是針對一個數(shù)據(jù),多次實施相同的操作效果是一致的。比如多次刪除一條數(shù)據(jù),最后的效果是一樣的,即這條數(shù)據(jù)被刪除,那么刪除操作是冪等的,而對于++運算符,每次操作的結(jié)果都是在上一次數(shù)據(jù)值上面加1,所以++操作不是冪等的)的。
- 401 Unauthorized - [*]:表示用戶沒有權(quán)限(令牌、用戶名、密碼錯誤)。
- 403 Forbidden - [*] 表示用戶得到授權(quán)(與401錯誤相對),但是訪問是被禁止的。
- 404 NOT FOUND - [*]:用戶發(fā)出的請求針對的是不存在的記錄,服務(wù)器沒有進行操作,該操作是冪等的。
- 406 Not Acceptable - [GET]:用戶請求的格式不可得(比如用戶請求JSON格式,但是只有XML格式)。
- 410 Gone -[GET]:用戶請求的資源被永久刪除,且不會再得到的。
- 422 Unprocesable entity - [POST/PUT/PATCH] 當(dāng)創(chuàng)建一個對象時,發(fā)生一個驗證錯誤。
- 500 INTERNAL SERVER ERROR - [*]:服務(wù)器發(fā)生錯誤,用戶將無法判斷發(fā)出的請求是否成功。
小結(jié)
在本節(jié)中,主要針對RESTful的常見的設(shè)計做出了一些解釋,到此,關(guān)于RESTful的基本概念介紹完畢,要真正的去理解和體會RESTful的好處,還需要在實際的開發(fā)中慢慢看。從下一篇文章開始,進入RESTful的開發(fā)基礎(chǔ)介紹。
總結(jié)
以上是生活随笔為你收集整理的Java开发RESTful(三)RESTful设计的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 路由器映射设置方法 路由器如何对端口映射
- 下一篇: 富士施乐s2020扫描设置方法