Roy Thomas Fielding博士2000年提出的java
REST是英文Representationalweb
State Transfer的縮寫json
表象化狀態轉變 或者 表述性狀態轉移瀏覽器
REST是Web服務的一種架構風格安全
使用HTTP、URI等普遍流行的標準和協議服務器
輕量級、跨平臺、跨語言的架構設計。網絡
REST是一種設計風格。它不是一種標準,也不是一種軟件,而是一種思想。架構
REST一般基於使用HTTP,URI,和XML,JSON以及HTML這些現有的普遍流行的協議和標準。app
RESTful對應的中文是 REST式的。less
RESTful Web Service是一種常見的REST的應用,是遵照了REST風格的web服務。
JAX-RS
RESTful Web Service
JAX-WS Web Service
網絡上的全部事物均可被抽象爲資源(Resource)
每一個資源都有一個惟一的資源標識符(Resource
Identifier)
同一資源具備多種表現形式(xml、json等)
對資源的各類操做不會改變資源標識符
全部的操做都是無狀態的(Stateless)
符合REST原則的架構方式便可稱爲RESTful
無狀態性
無狀態性使得客戶端和服務器端沒必要保存對方的詳細信息,服務器只須要處理當前
Request,而沒必要了解前面
Request 的歷史。
從而能夠更容易地釋放資源。
讓服務器充分利用
Pool 技術來提升穩定性和性能。
GET: 獲取一個資源
POST: 建立一個新的資源
PUT: 修改一個資源的狀態
DELETE :刪除一個資源
資源展示
XML
JSON
……
原來的方式
http://127.0.0.1/user/queryUser/{id} GET方法,根據用戶id****獲取數據
http://127.0.0.1/user/updateUser POST****方法,用戶修改
http://127.0.0.1/user/saveUser POST****方法,用戶新增
http://127.0.0.1/user/deleteUser/{id} GET/POST方法,用戶根據id****刪除
RESTful
[http://127.0.0.1/user/](http://127.0.0.1/user/ {id})[ {id}](http://127.0.0.1/user/ {id}) GET方法,根據用戶id****獲取數據
http://127.0.0.1/user/ PUT****方法,用戶修改
http://127.0.0.1/user/ POST****方法,用戶新增
http://127.0.0.1/user/{id} DELETE方法,用戶根據id****刪除
開發的接口,web服務更加的簡潔
REST接口定義
冪等性:對同一REST接口的屢次訪問,獲得的資源狀態是相同的。
安全性:對該REST接口訪問,不會使服務器端資源狀態發生改變。
最佳實踐:REST接口設計
• URL的組成
– 網絡協議(http、https)
– 服務器地址
– 接口名稱
– 參數列表
• URL定義限定
– 不要使用大寫字母
– 使用中線 - 代替下劃線 _
– 參數列表應該被encode過
最佳實踐:響應設計
Content body 僅僅用來傳輸數據
數據要作到拿來就可用的原則,不須要「拆箱」的過程
用來描述數據或者請求的元數據放Header中
http響應狀態碼
SpringMVC原生態的支持了REST風格的架構設計。
所涉及到的註解:
@RequestMapping
@PathVariable
@ResponseBody
ResponseEntity
……
根據RESTful風格,編寫商品功能的增刪改查接口
編寫商品查詢接口
在ItemInterfaceController編寫
@Controller @RequestMapping("item/interface") public class ItemInterfaceController { @Autowired private ItemService itemService; // http://manager.taotao.com/rest/item/interface/{id} /** * 根據id查詢用戶 * * @param id * @return 返回的類型是ResponseEntity,泛型聲明爲須要返回的數據類型 */ @RequestMapping(value = "{id}", method = RequestMethod.GET) // 返回的是ResponseEntity或者加上@ResponseBody註解的效果是同樣的,任選其一便可,也能夠都設置。 // @ResponseBody public ResponseEntity<Item> queryItemById(@PathVariable("id") Long id) { try { Item item = this.itemService.queryById(id); // 查詢成功,響應的狀態碼應爲200 // 能夠設置HttpStatus枚舉的OK // return ResponseEntity.status(HttpStatus.OK).body(Item); // 也可使用ok()方法,效果和上面是同樣的 return ResponseEntity.ok().body(item); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } // 若是有異常,設置狀態碼爲500 return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(null); } }