restFul理論知識
- " 如果一個架構符合REST的約束條件和原則,我們就稱它爲RESTful架構"。
- “REST架構風格並不是綁定在HTTP上,只不過目前HTTP是唯一與REST相關的實例”
- “要讓一個資源可以被識別,需要有個唯一標識,在Web中這個唯一標識就是URI(Uniform Resource Identifier)。URI既可以看成是資源的地址,也可以看成是資源的名稱。”
- “URI的設計應該遵循可尋址性原則,具有自描述性,需要在形式上給人以直覺上的關聯。”
URI設計的一些原則
- 如何才能讓"URI的設計應該遵循可尋址性原則,具有自描述性,需要在形式上給人以直覺上的關聯"呢?最基本,可以把握如下原則
1. post、get、put、delete包含不同的含義。
方式 | 含義 |
---|---|
POST | 首次創建 |
GET | 獲取 |
PUT | 更新 |
DELETE | 刪除 |
2.post、get、put、delete的構成了資源CRUD。
方式 | 操作 |
---|---|
POST | C |
GET | R |
PUT | U |
DELETE | D |
3.uri中可以不用出現save、delete、update、findAll等關鍵字,只需要合理使用不同請求法方式即可。
傳統:http://localhost:8080/user/save
REST:http://localhost:8080/user POST 執行保存
傳統:http://localhost:8080/user/delete
?id=1
REST:http://localhost:8080/user/1 DELETE 執行刪除
傳統:http://localhost:8080/user/update
?id=1
REST:http://localhost:8080/user/1 PUT 執行更新 1就是id
傳統:http://localhost:8080/user/findAll
REST:http://localhost:8080/user GET 查所有
4.路徑本身就可以傳遞參數,不用一定需要?key=value
形式
傳統:http://localhost:8080/user/delete
?id=1
REST:http://localhost:8080/user/1 DELETE 執行刪除
5._或-來讓URI可讀性更好
越多的網站使用_或-來分隔一些單詞,讓URI看上去更爲人性化。 例如國內比較出名的開源中國社區,它上面的新聞地址就採用這種風格, 如http://www.oschina.net/news/38119/oschina-translate-reward-plan
6.使用/來表示資源的層級關係
https://github.com/git/git/commit/e3af72cdafab5993d18fae056f87e1d675913d08
就表示了一個多級的資源, 指的是git用戶的git項目的某次提交記錄,又例如/orders/2012/10可以用來表示2012年10月的訂單記錄。
7.?用來過濾資源
/pulls?state=closed用來表示git項目中已經關閉的推入請求, 這種URL通常對應的是一些特定條件的查詢結果或算法運算結果。
8.,或;可以用來表示同級資源的關係
哪天github可以比較某個文件在隨意兩次提交記錄之間的差異,或許可以使用/git/git /block-sha1/sha1.h/compare/e3af72cdafab5993d18fae056f87e1d675913d08;bd63e61bdf38e872d5215c07b264dcc16e4febca作爲URI。
9.版本號可以在HTTP請求頭信息的Accept字段中進行區分
http://www.example.com/app/foo
不同版本請求頭
Accept: vnd.example-com.foo+json; version=1.0
Accept: vnd.example-com.foo+json; version=1.1
Accept: vnd.example-com.foo+json; version=2.0
# 10.uri不包含動作
URI包含動詞(正確的寫法是把動詞transfer改成名詞transaction),因爲post本生就包含具體的動作。
錯誤:
POST /accounts/1/transfer/500/to/2
正確:
POST /accounts/1/transaction/500/to/2
同樣如下也是錯誤的
GET /getUser/1
POST /createUser
PUT /updateUser/1
DELETE /deleteUser/1