Rest風格的請求方式
使用Rest前,首先說一說Rest請求方式的好處,首先就是面向資源URI,即http請求的路徑,Rest規定中要求URI各層只能用名詞不用動詞,這樣相比傳統的get請求有利於傳輸資料的穩定性,資料的操作流程不會被人輕易看破,也便於團隊開發,各種URI一目瞭然;
再通過固定的請求方式,對URI中的資源進行各種操作,常用的有:
- GET:查詢;
- POST:新增;
- PUT:修改;
- DELETE:刪除;
符合這種風格的http請求,我們就叫它RestFul;
者其中還涉及到一個概念,叫做冪等性,即對該URI多少次操作,返回的結果都是相同的。因為POST是新增,因此理論上講他不是冪等的,其他方法都是冪等的。
接下來是實戰,spring-boot架構,寫了一個測試類,使用postman進行http請求測試:
@RestController public class UserController {
@RestController:這是spring-boot的註解:包含
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Controller @ResponseBody說明它既是一個controller,同時支援rest風格
@PathVariable:自動將rest請求匹配到同名引數上
@ModelAttribute:自動將請求的form表單引數 組裝成物件
@RequestBody:自動將請求的json引數 組裝成物件
下面開始放碼:
查詢:
/** * restful風格操作 * @param name * @return */ @RequestMapping(value="/xx/{name}",method= RequestMethod.GET,produces="application/json;charset=UTF-8") private String query( @PathVariable String name) { String result = "查詢一個名為"+name+"的結果"; return result; }
新增:
/** * 新增 * @param user * @return*/ @RequestMapping(value="/xx",method= RequestMethod.POST,produces="application/json;charset=UTF-8") private String add(@RequestBody User user) { String result = "新增一個名為"+user.getUsername()+",密碼為"+user.getPassword()+"的結果"; return result; }
刪除:
/** * 刪除 * @param username * @return */ @RequestMapping(value="/xx/{username}",method= RequestMethod.DELETE,produces="application/json;charset=UTF-8") private String del(@PathVariable String username) { String result = "刪除一個名為"+username+"的結果"; return result; }
修改:
為啥最後才說修改呢,因為有坑唄!
/** * 修改 * @param user * @return */ @RequestMapping(value="/xx",method= RequestMethod.PUT,produces="application/json;charset=UTF-8") private String edit(@RequestBody User user) { String result = "修改一個名為"+user.getUsername()+",密碼為"+user.getPassword()+"的結果"; return result; }
我們發現,post和put的引數由@ModelAttribute變成了@RequestBody;
這是因為我一開始通過postman模仿form表單提交【修改】,後臺引數為null,百度之,眾多高手,有的說spring不支援put請求,有的說form表單不支援PUT和DELETE,有的說需要個過濾器。
我也挨個試了一下,最後發現用json還是可以的:
於是有了這些總結,最後在提到一個小朋友:
PATCH:
理論上講PUT所做的更新是對整個物件來說的,一般都是將整個物件傳輸到後臺進行整體修改,如果我只有一個欄位想要改變,也要這麼做,有點浪費頻寬,所以出現了PATCH:【區域性更新】;
有人說PUT冪等,PATCH不冪等;
PUT把一個檔案或資源放在一個特定的URI處,並且正好在那個URI處。如果該URI處已有檔案或資源,則PUT 將替換該檔案或資源。如果那裡沒有檔案或資源,PUT 建立一個。PUT是冪等的,但矛盾的是PUT響應不可快取。
POST將資料傳送到特定的URI,並期望該URI處的資源處理該請求。此時,Web伺服器可以確定如何處理指定資源上下文中的資料。POST方法不是冪等的,但只要伺服器設定適當的Cache-Control和Expires標頭,POST響應就可以快取。
PUT或PATCH?
PUT 用所提供的新表示替換整個資源PATCH 使用提供的值替換源資源的某些部分