本篇內容主要講解“java的RESTful規(guī)范有哪些”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“java的RESTful規(guī)范有哪些”吧!
讓客戶滿意是我們工作的目標,不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領域值得信任、有價值的長期合作伙伴,公司提供的服務項目有:域名注冊、雅安服務器托管、營銷軟件、網站建設、新巴爾虎左網站維護、網站推廣。
一種軟件架構風格、設計風格,而不是標準,只是提供了一組設計原則和約束條件。它主要用于客戶端和服務器交互類的軟件。基于這個風格設計的軟件可以更簡潔,更有層次,更易于實現緩存等機制。
1.不用大寫;
2.用中杠 - 不用下杠 _ ;
3.參數列表要encode;
4.URI中的名詞表示資源集合,使用復數形式。
5.在RESTful架構中,每個網址代表一種資源(resource),所以網址中不能有動詞,只能有名詞(特殊情況可以使用動詞),而且所用的名詞往往與數據庫的表格名對應。
URI表示資源的兩種方式:資源集合、單個資源。
資源集合:
/zoos //所有動物園
/zoos/1/animals //id為1的動物園中的所有動物
單個資源:
/zoos/1//id為1的動物園
/zoos/1;2;3//id為1,2,3的動物園
在url中表達層級,用于 按實體關聯(lián)關系進行對象導航 ,一般根據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:創(chuàng)建單個新資源。 POST一般向“資源集合”型uri發(fā)起
POST/animals //新增動物
POST/zoos/1/employees //為id為1的動物園雇傭員工
PUT:更新單個資源(全量),客戶端提供完整的更新后的資源。與之對應的是 PATCH,PATCH負責部分更新,客戶端提供要更新的那些字段。 PUT/PATCH一般向“單個資源”型uri發(fā)起
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. 安全性 :不會改變資源狀態(tài),可以理解為只讀的;
2. 冪等性 :執(zhí)行1次和執(zhí)行N次,對資源狀態(tài)改變的效果是等價的。
. | 安全性 | 冪等性 |
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
狀態(tài)碼
服務器向用戶返回的狀態(tài)碼和提示信息,常見的有以下一些(方括號中是該狀態(tài)碼對應的HTTP動詞)。
§200 OK - [GET]:服務器成功返回用戶請求的數據,該操作是冪等的(Idempotent)。
§201 CREATED - [POST/PUT/PATCH]:用戶新建或修改數據成功。
§202 Accepted - [*]:表示一個請求已經進入后臺排隊(異步任務)
§204 NO CONTENT - [DELETE]:用戶刪除數據成功。
§400 INVALID REQUEST - [POST/PUT/PATCH]:用戶發(fā)出的請求有錯誤,服務器沒有進行新建或修改數據的操作,該操作是冪等的。
§401 Unauthorized - [*]:表示用戶沒有權限(令牌、用戶名、密碼錯誤)。
§403 Forbidden - [*] 表示用戶得到授權(與401錯誤相對),但是訪問是被禁止的。
§404 NOT FOUND - [*]:用戶發(fā)出的請求針對的是不存在的記錄,服務器沒有進行操作,該操作是冪等的。
§406 Not Acceptable - [GET]:用戶請求的格式不可得(比如用戶請求JSON格式,但是只有XML格式)。
§410 Gone -[GET]:用戶請求的資源被永久刪除,且不會再得到的。
§422 Unprocesable entity - [POST/PUT/PATCH] 當創(chuàng)建一個對象時,發(fā)生一個驗證錯誤。
§500 INTERNAL SERVER ERROR - [*]:服務器發(fā)生錯誤,用戶將無法判斷發(fā)出的請求是否成功。
狀態(tài)碼的完全列表參見這里
URI失效
隨著系統(tǒng)發(fā)展,總有一些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. 不要發(fā)生了錯誤但給2xx響應,客戶端可能會緩存成功的http請求;
2. 正確設置http狀態(tài)碼,不要自定義;
3. Response body提供
即:返回的信息中將error作為鍵名,出錯信息作為鍵值即可
1)錯誤的代碼(日志/問題追查);
2)錯誤的描述文本(展示給用戶)。
對第三點的實現稍微多說一點:
Java服務器端一般用異常表示 RESTful API的錯誤。API 可能拋出兩類異常:業(yè)務異常和非業(yè)務異常。 業(yè)務異常 由自己的業(yè)務代碼拋出,表示一個用例的前置條件不滿足、業(yè)務規(guī)則沖突等,比如參數校驗不通過、權限校驗失敗。 非業(yè)務類異常 表示不在預期內的問題,通常由類庫、框架拋出,或由于自己的代碼邏輯錯誤導致,比如數據庫連接失敗、空指針異常、除0錯誤等等。
業(yè)務類異常必須提供2種信息:
1. 如果拋出該類異常,HTTP響應狀態(tài)碼應該設成什么;
2. 異常的文本描述;
在Controller層使用統(tǒng)一的異常攔截器:
1. 設置 HTTP響應狀態(tài)碼:對業(yè)務類異常,用它指定的 HTTPcode;對非業(yè)務類異常,統(tǒng)一500;
2. Response Body的錯誤碼:異常類名
3. Response Body的錯誤描述:對業(yè)務類異常,用它指定的錯誤文本;對非業(yè)務類異常,線上可以統(tǒng)一文案如“服務器端錯誤,請稍后再試”,開發(fā)或測試環(huán)境中用異常的 stacktrace,服務器端提供該行為的開關。
常用的http狀態(tài)碼及使用場景:
狀態(tài)碼 | 使用場景 |
400 bad request | 常用在參數校驗 |
401 unauthorized | 未經驗證的用戶,常見于未登錄。如果經過驗證后依然沒權限,應該 403(即 authentication和 authorization的區(qū)別)。 |
403 forbidden | 無權限 |
404 not found | 資源不存在 |
500 internal server error | 非業(yè)務類異常 |
503 service unavaliable | 由容器拋出,自己的代碼不要拋這個異常 |
(1)API的身份認證應該使用OAuth3.0框架
(2)服務器返回的數據格式,應該盡量使用JSON,避免使用XML
(3)比較復雜的接口不能確定是使用POST還是PUT時,要看具體的業(yè)務層代碼,看看接口產生的結果是否冪等,如果冪等用PUT,相反用POST
如:接口接收到一資源,資源存在更新,不存在插入新數據,這個接口就要用PUT
到此,相信大家對“java的RESTful規(guī)范有哪些”有了更深的了解,不妨來實際操作一番吧!這里是創(chuàng)新互聯(lián)網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續(xù)學習!