1. 程式人生 > >Rest風格的請求方式

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 使用提供的值替換源資源的某些部分