如何讓Spring Rest 接口中路徑參數可選
Spring Rest接口路徑參數可選
我有一個 Spring Rest 服務,其中有一個路徑參數是可選的(實際情況是我原來將參數放到路徑中,而另外一個前端通過 body 傳給我)。按照傳統的方式是把這個服務在代碼裡面分成兩個方法,一個帶路徑參數,一個不帶,但是這樣看起來不優雅,讓人疑惑。
我試著給 @PathVariable 註解加上 require=false 註解,但是不起作用,返回404錯誤。
下面的形式就是傳統方式:
@RequestMapping(value = "/path/{id}") public String getResource(@PathVariable String id) { return service.processResource(id); } @RequestMapping(value = "/path") public String getResource() { return service.processResource(); }
但是我真的不喜歡這種方式,臃腫。
從 Spring 4 and Java 8 開始(其實和 Java 8 關系不大),在一個方法裡面實現可選路徑參數變得很簡單,如下所示,就是同時定義兩個路由:
@RequestMapping(value = {"/path", "/path/{id}") public String getResource(@PathVariable Optional<String> id) { if (id.isPresent()) { return service.processResource(id.get()); } else { return service.processResource(); } }
確實,在一個方法裡面統一業務要優雅得多。
RestFul風格傳參
RestFul風格就是所有參數都由/傳遞,而不是傳統的?xx&xx形式
例如:寫一個Controller:
package controller; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class RestfulController { @RequestMapping("/add") public String test(int a,int b, Model model){ int res = a+b; model.addAttribute("msg","結果為"+res); return "test"; } }
可以看到出現a,b沒找到的錯誤
按照傳統方式傳遞參數:?a=1&b=2
那麼按照Restful風格傳遞參數就應該:在方法參數值前加@PathVariable註解,並在url上直接綁定參數,可以同時設置Request的方法類型(GET、POST、DELETE、OPTIONS、HEAD、PATCH、PUT、TRACE)
@PathVariable:讓方法參數的值對應綁定到一個url模板變量上
package controller; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class RestfulController { @RequestMapping(value = "/add/{a}/{b}",method = RequestMethod.GET) public String test(@PathVariable int a,@PathVariable int b, Model model){ int res = a+b; model.addAttribute("msg","結果為"+res); return "test"; } }
再次開啟Tomcat,並設定a=1,b=3:
/add/1/3傳遞參數
這就是restful風格傳參
也可以通過變相的組合註解實現:
@PostMapping
@GetMapping
@PutMapping
@DeleteMapping
@PatchMapping
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- Spring mvc是如何實現與數據庫的前後端的連接操作的?
- 如何利用Spring MVC實現RESTful風格
- RestFul風格 — 使用@PathVariable傳遞參數報錯404的解決
- @PathVariable註解,讓spring支持參數帶值功能的案例
- SpringBoot 工程中的異常處理方式