SpringBoot獲取前臺(tái)參數(shù)的六種方式以及統(tǒng)一響應(yīng)
請(qǐng)求
SpringBoot接受前臺(tái)參數(shù)的六種方式,首先因?yàn)閺那芭_(tái)發(fā)送的請(qǐng)求沒有界面的話只能是從地址欄發(fā)送并且只能是Get請(qǐng)求,為了測(cè)試其他的請(qǐng)求,所以我們使用一個(gè)工具->Postman,Postman是一款功能強(qiáng)大的網(wǎng)頁調(diào)試與發(fā)送網(wǎng)頁HTTP請(qǐng)求的Chrome插件。
對(duì)于前臺(tái)傳過來的參數(shù)大致分為六種,下面一個(gè)一個(gè)的做演示學(xué)習(xí):演示之前先復(fù)習(xí)一下,沒用SpringBoot獲取前臺(tái)參數(shù)的方式,通過request對(duì)象獲取。
@RestController
public class RequestController {
//原始方式
@RequestMapping("/simpleParam")
public String simpleParam(HttpServletRequest request){
// http://localhost:8080/simpleParam?name=Tom&age=10
// 請(qǐng)求參數(shù): name=Tom&age=10 (有2個(gè)請(qǐng)求參數(shù))
// 第1個(gè)請(qǐng)求參數(shù): name=Tom 參數(shù)名:name,參數(shù)值:Tom
// 第2個(gè)請(qǐng)求參數(shù): age=10 參數(shù)名:age , 參數(shù)值:10
String name = request.getParameter("name");//name就是請(qǐng)求參數(shù)名
String ageStr = request.getParameter("age");//age就是請(qǐng)求參數(shù)名
int age = Integer.parseInt(ageStr);//需要手動(dòng)進(jìn)行類型轉(zhuǎn)換
System.out.println(name+" : "+age);
return "OK";
}
}
在Springboot的環(huán)境中,對(duì)原始的API進(jìn)行了封裝,接收參數(shù)的形式更加簡單。 如果是簡單參數(shù),參數(shù)名與形參變量名相同,定義同名的形參即可接收參數(shù)。
1、簡單參數(shù)
@RestController
public class RequestController {
// http://localhost:8080/simpleParam?name=Tom&age=10
// 第1個(gè)請(qǐng)求參數(shù): name=Tom 參數(shù)名:name,參數(shù)值:Tom
// 第2個(gè)請(qǐng)求參數(shù): age=10 參數(shù)名:age , 參數(shù)值:10
//springboot方式
@RequestMapping("/simpleParam")
public String simpleParam(String name , Integer age ){//形參名和請(qǐng)求參數(shù)名保持一致
System.out.println(name+" : "+age);
return "OK";
}
}
如果后臺(tái)需要但是前臺(tái)并沒傳對(duì)應(yīng)的參數(shù),這個(gè)時(shí)候會(huì)返回 null
當(dāng)前臺(tái)傳的參數(shù)名和后臺(tái)接受參數(shù)的方法形參列表不一致的時(shí)候,可以通過@RequestParam(“ ”)來指定
@RestController
public class RequestController {
// http://localhost:8080/simpleParam?name=Tom&age=20
// 請(qǐng)求參數(shù)名:name
//springboot方式
@RequestMapping("/simpleParam")
public String simpleParam(@RequestParam("name") String username , Integer age ){
System.out.println(username+" : "+age);
return "OK";
}
}
另外@RequestParam中的required屬性默認(rèn)為true(默認(rèn)值也是true),代表該請(qǐng)求參數(shù)必須傳遞,如果不傳遞將報(bào)錯(cuò),如果該參數(shù)是可選的,可以將required屬性設(shè)置為false
代碼如下:
@RequestMapping("/simpleParam")
public String simpleParam(@RequestParam(name = "name", required = false) String username, Integer age){
System.out.println(username+ ":" + age);
return "OK";
}
這個(gè)注解還有一個(gè)參數(shù),是defaultValue表示如果前臺(tái)沒有傳遞參數(shù)就默認(rèn)為當(dāng)前指定的值。
@RequestMapping("/simpleParam")
public String simpleParam(@RequestParam(name = "name", required = false,defaultValue ="匿名用戶") String userName, Integer age) {
// 打印輸出
System.out.println(userName+"----"+age);
return "ok";
}
2、實(shí)體參數(shù)
簡單實(shí)體對(duì)象:
在使用簡單參數(shù)做為數(shù)據(jù)傳遞方式時(shí),前端傳遞了多少個(gè)請(qǐng)求參數(shù),后端controller方法中的形參就要書寫多少個(gè)。如果請(qǐng)求參數(shù)比較多,通過上述的方式一個(gè)參數(shù)一個(gè)參數(shù)的接收,會(huì)比較繁瑣。
此時(shí),我們可以考慮將請(qǐng)求參數(shù)封裝到一個(gè)實(shí)體類對(duì)象中。 要想完成數(shù)據(jù)封裝,需要遵守如下規(guī)則:請(qǐng)求參數(shù)名與實(shí)體類的屬性名相同
要求是前臺(tái)傳過來的參數(shù)必須和對(duì)象中的參數(shù)名稱相同,順序相同。
@RestController
public class RequestController {
// http://localhost:8080/simpleParam?name=Tom&age=20
//實(shí)體參數(shù):簡單實(shí)體對(duì)象 User有兩個(gè)屬性,一個(gè)是name 一個(gè)是age,這樣Spring就會(huì)自動(dòng)完成賦值
@RequestMapping("/simplePojo")
public String simplePojo(User user){
System.out.println(user);
return "OK";
}
}
復(fù)雜實(shí)體對(duì)象:對(duì)象套對(duì)象
比如說User中又多了一個(gè)字段: Address 而這個(gè)類又有兩個(gè)屬性,這個(gè)時(shí)候前臺(tái)傳遞參數(shù)的時(shí)候就需要發(fā)生改變,后臺(tái)還是用User接受
public class User {
private String name;
private Integer age;
private Address address; //地址對(duì)象
.....
}
public class Address {
private String province;
private String city;
.....
}
方法代碼
@RestController
public class RequestController {
//實(shí)體參數(shù):復(fù)雜實(shí)體對(duì)象
@RequestMapping("/complexPojo")
public String complexPojo(User user){
System.out.println(user);
return "OK";
}
}

3、數(shù)組集合參數(shù)
數(shù)組集合參數(shù)的使用場(chǎng)景:在HTML的表單中,有一個(gè)表單項(xiàng)是支持多選的(復(fù)選框),可以提交選擇的多個(gè)值。
xxxxxxxx?hobby=game&hobby=java
后端程序接收上述多個(gè)值的方式有兩種:
- 數(shù)組
- 集合
數(shù)組參數(shù):請(qǐng)求參數(shù)名與形參數(shù)組名稱相同且請(qǐng)求參數(shù)為多個(gè),定義數(shù)組類型形參即可接收參數(shù)
@RestController
public class RequestController {
//數(shù)組集合參數(shù)
@RequestMapping("/arrayParam")
public String arrayParam(String[] hobby){
System.out.println(Arrays.toString(hobby));
return "OK";
}
}
集合參數(shù):請(qǐng)求參數(shù)名與形參集合對(duì)象名相同且請(qǐng)求參數(shù)為多個(gè),@RequestParam 綁定參數(shù)關(guān)系
默認(rèn)情況下,請(qǐng)求中參數(shù)名相同的多個(gè)值,是封裝到數(shù)組。如果要封裝到集合,要使用@RequestParam綁定參數(shù)關(guān)系
Controller方法:
@RestController
public class RequestController {
//數(shù)組集合參數(shù)
@RequestMapping("/listParam")
public String listParam(@RequestParam List<String> hobby){
System.out.println(hobby);
return "OK";
}
}
4、日期參數(shù)
上述演示的都是一些普通的參數(shù),在一些特殊的需求中,可能會(huì)涉及到日期類型數(shù)據(jù)的封裝(其實(shí)我們一般都存字符串,不會(huì)轉(zhuǎn)來轉(zhuǎn)去,所以這里了解)。比如,如下需求:

因?yàn)槿掌诘母袷蕉喾N多樣(如:2022-12-12 10:05:45 、2022/12/12 10:05:45),那么對(duì)于日期類型的參數(shù)在進(jìn)行封裝的時(shí)候,需要通過@DateTimeFormat注解,以及其pattern屬性來設(shè)置日期的格式。
- @DateTimeFormat注解的pattern屬性中指定了哪種日期格式,前端的日期參數(shù)就必須按照指定的格式傳遞。
- 后端controller方法中,需要使用Date類型 LocalDateT或LocalDateTime類型,來封裝傳遞的參數(shù)。
Controller方法:
@RestController
public class RequestController {
//日期時(shí)間參數(shù)
@RequestMapping("/dateParam")
public String dateParam(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime updateTime){
System.out.println(updateTime);
return "OK";
}
}
5、JSON參數(shù)
在學(xué)習(xí)前端技術(shù)時(shí),我們有講到過JSON,而在前后端進(jìn)行交互時(shí),如果是比較復(fù)雜的參數(shù),前后端通過會(huì)使用JSON格式的數(shù)據(jù)進(jìn)行傳輸。 (JSON是開發(fā)中最常用的前后端數(shù)據(jù)交互方式) ,其實(shí)我們也會(huì)看到, 后臺(tái)如果返回給前臺(tái)數(shù)據(jù)的時(shí)候,有的是字符串,又的是集合,有的是JSON, 那么前臺(tái)在解析的時(shí)候就十分的麻煩, 后來經(jīng)過一個(gè)實(shí)體類用來存放所有的數(shù)據(jù), 然后返回這個(gè)對(duì)象, 這樣前臺(tái)在接受的時(shí)候只要處理JSON就好.在筆記的最后會(huì)提到
下面介紹在Postman中怎么發(fā)送JSON數(shù)據(jù):

服務(wù)端Controller方法接收J(rèn)SON格式數(shù)據(jù):
- 傳遞json格式的參數(shù),在Controller中會(huì)使用實(shí)體類進(jìn)行封裝。
- 封裝規(guī)則:JSON數(shù)據(jù)鍵名與形參對(duì)象屬性名相同,定義POJO類型形參即可接收參數(shù)。需要使用 @RequestBody標(biāo)識(shí)。
@RequestBody注解:將JSON數(shù)據(jù)映射到形參的實(shí)體類對(duì)象中(JSON中的key和實(shí)體類中的屬性名保持一致)
通過添加@RequestBody注解Spring可以自動(dòng)的將JSON轉(zhuǎn)換為對(duì)象.
實(shí)體類:
public class User {
private String name;
private Integer age;
private Address address;
//省略GET , SET 方法
}
@RestController
public class RequestController {
//JSON參數(shù)
@RequestMapping("/jsonParam")
public String jsonParam(@RequestBody User user){
System.out.println(user);
return "OK";
}
}
6、路徑參數(shù)(開發(fā)中使用的模式)
傳統(tǒng)的開發(fā)中請(qǐng)求參數(shù)是放在請(qǐng)求體(POST請(qǐng)求)傳遞或跟在URL后面通過?key=value的形式傳遞(GET請(qǐng)求)。
在現(xiàn)在的開發(fā)中,經(jīng)常還會(huì)直接在請(qǐng)求的URL中傳遞參數(shù)。例如:
http://localhost:8080/user/1
http://localhost:880/user/1/0
上述的這種傳遞請(qǐng)求參數(shù)的形式呢,我們稱之為:路徑參數(shù)。
學(xué)習(xí)路徑參數(shù)呢,主要掌握在后端的controller方法中,如何接收路徑參數(shù)。
路徑參數(shù):
- 前端:通過請(qǐng)求URL直接傳遞參數(shù)
- 后端:使用{…}來標(biāo)識(shí)該路徑參數(shù),需要使用@PathVariable獲取路徑參數(shù)
Controller方法:
@RestController
public class RequestController {
//路徑參數(shù)
@RequestMapping("/path/{id}")
public String pathParam(@PathVariable Integer id){
System.out.println(id);
return "OK";
}
}
傳遞多個(gè)路徑參數(shù):
@RestController
public class RequestController {
//路徑參數(shù) 前臺(tái)路徑 xxxx/path/12/jack
@RequestMapping("/path/{id}/{name}")
public String pathParam2(@PathVariable Integer id, @PathVariable String name){
System.out.println(id+ " : " +name);
return "OK";
}
}
響應(yīng):
前面我們學(xué)習(xí)過HTTL協(xié)議的交互方式:請(qǐng)求響應(yīng)模式(有請(qǐng)求就有響應(yīng))
那么Controller程序呢,除了接收請(qǐng)求外,還可以進(jìn)行響應(yīng)。先說一下使用到的注解:
@ResponseBody
- 類型:方法注解、類注解
- 位置:書寫在Controller方法上或類上
- 作用:將方法返回值直接響應(yīng)給瀏覽器
如果返回值類型是實(shí)體對(duì)象/集合,將會(huì)轉(zhuǎn)換為JSON格式后在響應(yīng)給瀏覽器
在我們前面所編寫的controller方法中,都已經(jīng)設(shè)置了響應(yīng)數(shù)據(jù)。看一下類的注解@RestController, 這個(gè)注解是一個(gè)復(fù)合注解,里面包括了 @ResponseBody

結(jié)論:在類上添加@RestController就相當(dāng)于添加了@ResponseBody注解。
類上有@RestController注解或@ResponseBody注解時(shí):表示當(dāng)前類下所有的方法返回值做為響應(yīng)數(shù)據(jù)方法的返回值,如果是一個(gè)POJO對(duì)象或集合時(shí),會(huì)先轉(zhuǎn)換為JSON格式,在響應(yīng)給瀏覽器
下面我們來測(cè)試下響應(yīng)數(shù)據(jù):
@RestController
public class ResponseController {
//響應(yīng)字符串
@RequestMapping("/hello")
public String hello(){
System.out.println("Hello World ~");
return "Hello World ~";
}
//響應(yīng)實(shí)體對(duì)象
@RequestMapping("/getAddr")
public Address getAddr(){
Address addr = new Address();//創(chuàng)建實(shí)體類對(duì)象
addr.setProvince("廣東");
addr.setCity("深圳");
return addr;
}
//響應(yīng)集合數(shù)據(jù)
@RequestMapping("/listAddr")
public List<Address> listAddr(){
List<Address> list = new ArrayList<>();//集合對(duì)象
Address addr = new Address();
addr.setProvince("廣東");
addr.setCity("深圳");
Address addr2 = new Address();
addr2.setProvince("陜西");
addr2.setCity("西安");
list.add(addr);
list.add(addr2);
return list;
}
}在服務(wù)響應(yīng)了一個(gè)對(duì)象或者集合,那私前端獲取到的數(shù)據(jù)是什么樣子的呢?我們使用postman發(fā)送請(qǐng)求來測(cè)試下。測(cè)試效果如下:


統(tǒng)一響應(yīng)結(jié)果
可能大家會(huì)發(fā)現(xiàn),我們?cè)谇懊嫠帉懙倪@些Controller方法中,返回值各種各樣,沒有任何的規(guī)范。

如果我們開發(fā)一個(gè)大型項(xiàng)目,項(xiàng)目中controller方法將成千上萬,使用上述方式將造成整個(gè)項(xiàng)目難以維護(hù)。那在真實(shí)的項(xiàng)目開發(fā)中是什么樣子的呢?
在真實(shí)的項(xiàng)目開發(fā)中,無論是哪種方法,我們都會(huì)定義一個(gè)統(tǒng)一的返回結(jié)果。方案如下:

這樣前端只需要按照統(tǒng)一格式的返回結(jié)果進(jìn)行解析(僅一種解析方案),就可以拿到數(shù)據(jù)。
統(tǒng)一的返回結(jié)果使用類來描述,在這個(gè)結(jié)果中包含:
- 響應(yīng)狀態(tài)碼:當(dāng)前請(qǐng)求是成功,還是失敗
- 狀態(tài)碼信息:給頁面的提示信息
- 返回的數(shù)據(jù):給前端響應(yīng)的數(shù)據(jù)(字符串、對(duì)象、集合)
定義在一個(gè)實(shí)體類Result來包含以上信息。代碼如下:
public class Result {
private Integer code;//響應(yīng)碼,1 代表成功; 0 代表失敗
private String msg; //響應(yīng)碼 描述字符串
private Object data; //返回的數(shù)據(jù)
public Result() { }
public Result(Integer code, String msg, Object data) {
this.code = code;
this.msg = msg;
this.data = data;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
//增刪改 成功響應(yīng)(不需要給前端返回?cái)?shù)據(jù))
public static Result success(){
return new Result(1,"success",null);
}
//查詢 成功響應(yīng)(把查詢結(jié)果做為返回?cái)?shù)據(jù)響應(yīng)給前端)
public static Result success(Object data){
return new Result(1,"success",data);
}
//失敗響應(yīng)
public static Result error(String msg){
return new Result(0,msg,null);
}
}
改造后的Controller:統(tǒng)一返回Result
@RestController
public class ResponseController {
//響應(yīng)統(tǒng)一格式的結(jié)果
@RequestMapping("/hello")
public Result hello(){
System.out.println("Hello World ~");
//return new Result(1,"success","Hello World ~");
return Result.success("Hello World ~");
}
//響應(yīng)統(tǒng)一格式的結(jié)果
@RequestMapping("/getAddr")
public Result getAddr(){
Address addr = new Address();
addr.setProvince("廣東");
addr.setCity("深圳");
return Result.success(addr);
}
//響應(yīng)統(tǒng)一格式的結(jié)果
@RequestMapping("/listAddr")
public Result listAddr(){
List<Address> list = new ArrayList<>();
Address addr = new Address();
addr.setProvince("廣東");
addr.setCity("深圳");
Address addr2 = new Address();
addr2.setProvince("陜西");
addr2.setCity("西安");
list.add(addr);
list.add(addr2);
return Result.success(list);
}
}


到此這篇關(guān)于SpringBoot獲取前臺(tái)參數(shù)的六種方式以及統(tǒng)一響應(yīng)的文章就介紹到這了,更多相關(guān)SpringBoot獲取前臺(tái)參數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot如何獲取Get請(qǐng)求參數(shù)詳解
- SpringBoot如何配置獲取request中body的json格式參數(shù)
- 使用springboot 獲取控制器參數(shù)的幾種方法小結(jié)
- SpringBoot之自定義Filter獲取請(qǐng)求參數(shù)與響應(yīng)結(jié)果案例詳解
- SpringBoot過濾器如何獲取POST請(qǐng)求的JSON參數(shù)
- Springboot攔截器如何獲取@RequestBody參數(shù)
- SpringBoot攔截器如何獲取http請(qǐng)求參數(shù)
- springboot中不能獲取post請(qǐng)求參數(shù)的解決方法
- springboot如何去獲取前端傳遞的參數(shù)的實(shí)現(xiàn)
- springboot獲取URL請(qǐng)求參數(shù)的多種方式
相關(guān)文章
SpringBoot整合阿里云視頻點(diǎn)播的過程詳解
視頻點(diǎn)播(ApsaraVideo for VoD)是集音視頻采集、編輯、上傳、自動(dòng)化轉(zhuǎn)碼處理、媒體資源管理、分發(fā)加速于一體的一站式音視頻點(diǎn)播解決方案。這篇文章主要介紹了SpringBoot整合阿里云視頻點(diǎn)播的詳細(xì)過程,需要的朋友可以參考下2021-12-12
Springboot設(shè)置默認(rèn)訪問路徑方法實(shí)現(xiàn)
這篇文章主要介紹了Springboot設(shè)置默認(rèn)訪問路徑方法實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
詳解Java中字典樹(Trie樹)的圖解與實(shí)現(xiàn)
Trie又稱為前綴樹或字典樹,是一種有序樹,它是一種專門用來處理串匹配的數(shù)據(jù)結(jié)構(gòu)。本文將利用圖解詳細(xì)講解Trie樹的實(shí)現(xiàn),需要的可以參考一下2022-05-05
Java的線程池ThreadPoolExecutor及多種線程池實(shí)現(xiàn)詳解
這篇文章主要介紹了Java的線程池ThreadPoolExecutor及多種線程池實(shí)現(xiàn)詳解,ThreadPoolExecutor 使用 int 的高 3 位來表示線程池狀態(tài),低 29 位表示線程數(shù)量,之所以將信息存儲(chǔ)在一個(gè)變量中,是為了保證原子性,需要的朋友可以參考下2024-01-01
mybatis條件語句中帶數(shù)組參數(shù)的處理
這篇文章主要介紹了mybatis條件語句中帶數(shù)組參數(shù)的處理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09
IDEA 啟動(dòng) Tomcat 項(xiàng)目輸出亂碼的解決方法
這篇文章主要介紹了IDEA 啟動(dòng) Tomcat 項(xiàng)目輸出亂碼的解決方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11
SpringBoot2零基礎(chǔ)到精通之JUnit 5與指標(biāo)監(jiān)控
SpringBoot是一種整合Spring技術(shù)棧的方式(或者說是框架),同時(shí)也是簡化Spring的一種快速開發(fā)的腳手架,本篇讓我們一起學(xué)習(xí)JUnit 5與指標(biāo)監(jiān)控2022-03-03
Java實(shí)現(xiàn)批量向mysql寫入數(shù)據(jù)的方法
這篇文章主要介紹了Java實(shí)現(xiàn)批量向mysql寫入數(shù)據(jù)的方法,涉及java基于JDBC連接mysql數(shù)據(jù)庫及寫入數(shù)據(jù)的相關(guān)操作技巧,非常簡單實(shí)用,需要的朋友可以參考下2017-12-12

