天天看點

路由傳參的幾種方式_STEP6.1 Controller常見收參方式

大二大三以來陸陸續續帶過很多小朋友做後端,往往最多的問題就是:前端和後端之間怎麼傳參數?後端和資料庫之間怎麼傳參數?這種層次之間傳遞參數的問題。

關于後端和資料庫之間的傳參,我們已經在STEP5中學會了使用JDBC的傳統方式,或者使用例如MyBatis等ORM架構來幫助我們進行實作。

孑辭:STEP5.1 初識MyBatis​zhuanlan.zhihu.com

路由傳參的幾種方式_STEP6.1 Controller常見收參方式

那麼前端和後端之間怎麼進行傳參呢?

在我們之前學習STEP4.4 寫一個簡易登入子產品中,其實已經接觸過了一個基本的接收參數的方法:

@GetMapping("/login/{username}/{password}")
  public String login(@PathVariable(value = "username",required = true)String username,
                        @PathVariable(value = "password",required = true)String password){
           

如果對這一行代碼不熟悉,可以回到我們的STEP4.4簡單回憶一下。

這裡再簡單解釋一下

@PathVariable

的含義:

例如對于上面這一行代碼,我們隻要把參數放在@GetMapping("/login/{username}/{password}")的{username}和{password}裡,在我們的方法中就可以通過

  1. @PathVariable(value = "username",required = true)String username
  2. @PathVariable(value = "password",required = true)String password

來把收到的參數分别指派給username和password。

如果簡單總結一下,@PathVariable是一種“顯式地把參數放在url中”的傳參方式。

而這樣一種傳參方式可能導緻url過長,而且Spring對于@PathVariable的處理會有一個比較複雜的流程,頻繁使用這種方式來收參不是一個好的決策。

那麼我們還可以使用什麼方式來進行收參呢?

每種不同的收參方式,也意味着前端要有對應的不同的傳參方式。

常見的方式有:Path,Query,Body,Form-data等。

以下我們會簡單解釋一下幾種方式的不同,并給出相應的背景代碼實作示例。而至于對應的前端如何傳參,請移步到文章末尾的transfer-demo。

一、Path

擷取路徑參數,形如……/{argue1}/{argue2}……使用

@PathVariable

接收

Controller示例代碼:

@PostMapping("/path/{id}/{name}/{age}")
public String getPath(@PathVariable("id")Integer id,
                       @PathVariable("name")String name,
                       @PathVariable("age")Integer age){}
           
二、Query

擷取查詢參數,形如……?argue1={argue1}&argue2={argue2}……使用

@RequestParam

接收

Controller示例代碼:

@PostMapping("/query")
public String getQuery(@RequestParam("id")Integer id,
                        @RequestParam("name")String name,
                        @RequestParam("age")Integer age){}
           
三、Body

擷取body參數,一般使用

@RequestBody

,用實體(可以了解為是簡單的Java Bean)接收

Controller示例代碼:

@PostMapping("/body")
public String getBody(@RequestBody Student student){}
           
四、Form-data

擷取表單參數,一般不使用注解,用實體接收

Controller示例代碼:

@PostMapping("/form_data")
public String getForm_data(Student student){}
           

最後附我們的transfer-demo的代碼:

(前端邏輯在resourcesstatictest.js中)

transfer-demo

運作項目後打開resources/static檔案夾的test.html即可

路由傳參的幾種方式_STEP6.1 Controller常見收參方式
路由傳參的幾種方式_STEP6.1 Controller常見收參方式

單擊start,可以看到四個彈窗,就是我們的前台發送了四個請求,分别由我們背景的四個方法來接收。

tips:

  • 在項目的控制層中還注入了一個工具對象gson,這個會在我們的下一節中展開。
  • 項目中有一個CorsConfig.java,在本節中沒有涉及到,可以暫時不管。在之後的STEP6.5中會講到,傳送門:STEP6.5 同源政策與跨域資源共享