SpringBoot請(qǐng)求與響應(yīng)實(shí)例全解析
Spring Boot請(qǐng)求與響應(yīng)
一、請(qǐng)求
1.簡(jiǎn)單參數(shù)
1.1請(qǐng)求參數(shù)名稱(chēng)與方法形參名稱(chēng)一致
@RestController
public class RequestController {
@RequestMapping("/easyParam")
public String simpleParam(String name ,Integer age){
//獲取請(qǐng)求參數(shù)
return name+":::"+age;
}
}postman測(cè)試( GET 請(qǐng)求)

postman測(cè)試( POST請(qǐng)求 )

結(jié)論:不論是GET請(qǐng)求還是POST請(qǐng)求,對(duì)于簡(jiǎn)單參數(shù)來(lái)講,只要保證請(qǐng)求參數(shù)名和Controller方法中的形參名保持一致,就可以獲取到請(qǐng)求參數(shù)中的數(shù)據(jù)值。
1.2請(qǐng)求參數(shù)名稱(chēng)與方法形參名稱(chēng)一致
@RequestMapping("/simpleParam")
public String simpleParam(String username , Integer age ){//請(qǐng)求參數(shù)名和形參名不相同
? return username+" : "+age;
}
結(jié)論:對(duì)于簡(jiǎn)單參數(shù)來(lái)講,請(qǐng)求參數(shù)名和controller方法中的形參名不一致時(shí),無(wú)法接收到請(qǐng)求數(shù)據(jù)。
解決方案:可以使用Spring提供的@RequestParam注解完成映射
? public String simpleParam(@RequestParam("name") String username , Integer age ){//請(qǐng)求參數(shù)名和形參名不相同
? return username+" : "+age;
}
如果該參數(shù)是可選的,可以將required屬性設(shè)置為false
@RequestMapping("/easyParam")
? public String simpleParam(@RequestParam(value = "name",required = false) String username , Integer age ){//請(qǐng)求參數(shù)名和形參名不相同
? ? ? return username+" : "+age;
? }2.實(shí)體參數(shù)
請(qǐng)求參數(shù)封裝到一個(gè)實(shí)體類(lèi)對(duì)象中。 請(qǐng)求參數(shù)名與實(shí)體類(lèi)的屬性名相同
2.1 簡(jiǎn)單實(shí)體對(duì)象
定義POJO實(shí)體類(lèi):
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student {
? private String name;
? private Integer age; ? ? ?
}Controller方法:
@RequestMapping("/easyPojo")
? public String simplePojo(Student student){
? ? ? return "name = "+student.getName()+", age = "+student.getAge()+";
? }
[說(shuō)明]參數(shù)名和實(shí)體類(lèi)屬性名一致時(shí),參數(shù)值才會(huì)傳遞,參數(shù)名和實(shí)體類(lèi)屬性名不一致時(shí),不傳遞值2.2 復(fù)雜實(shí)體對(duì)象
復(fù)雜實(shí)體對(duì)象指的是,在實(shí)體類(lèi)中有一個(gè)或多個(gè)屬性,也是實(shí)體對(duì)象類(lèi)型的。如下:
Student類(lèi)中有一個(gè)Address類(lèi)型的屬性(Address是一個(gè)實(shí)體類(lèi))
復(fù)雜實(shí)體對(duì)象的封裝,需要遵守如下規(guī)則:
請(qǐng)求參數(shù)名與形參對(duì)象屬性名相同,按照對(duì)象層次結(jié)構(gòu)關(guān)系即可接收嵌套實(shí)體類(lèi)屬性參數(shù)。
定義POJO實(shí)體類(lèi):
Address實(shí)體類(lèi)
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Address {
? private String province;
? private String city;
}Student實(shí)體類(lèi)
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student {
private String name;
private Integer age;
private Address address;
}Controller方法:
@RestController
public class RequestController {
//實(shí)體參數(shù):復(fù)雜實(shí)體對(duì)象
@RequestMapping("/complexPojo")
public String complexPojo(Student student){
return "name = "+student.getName()+
", age = "+student.getAge()+
", job = "+student.getJob()+
", address.city = "+student.getAddress().getCity()+
", address.province = "+student.getAddress().getProvince();
}
}Postman測(cè)試:

3.數(shù)組集合參數(shù)
數(shù)組集合參數(shù)的使用場(chǎng)景:在HTML的表單中,有一個(gè)表單項(xiàng)是支持多選的(復(fù)選框),可以提交選擇的多個(gè)值。
后端程序接收上述多個(gè)值的方式有兩種:數(shù)組、集合 3.1 數(shù)組
數(shù)組參數(shù):請(qǐng)求參數(shù)名與形參數(shù)組名稱(chēng)相同且請(qǐng)求參數(shù)為多個(gè),定義數(shù)組類(lèi)型形參即可接收參數(shù)
Controller方法:
//數(shù)組集合參數(shù)
@RequestMapping("/arrayParam")
public String arrayParam(String[] course){
System.out.println(Arrays.toString(course));
return "課程: "+Arrays.toString(course);
}Postman測(cè)試:


3.2 集合
默認(rèn)情況下,請(qǐng)求中參數(shù)名相同的多個(gè)值,是封裝到數(shù)組。如果要封裝到集合,要使用@RequestParam綁定參數(shù)關(guān)系
Controller方法:
//數(shù)組集合參數(shù)
@RequestMapping("/listParam")
public String listParam(@RequestParam List<String> course){
return "課程: "+course;
}Postman測(cè)試:


- 3日期參數(shù)
日期類(lèi)型的參數(shù)在進(jìn)行封裝的時(shí)候,需要通過(guò)@DateTimeFormat注解,以及其pattern屬性來(lái)設(shè)置日期的格式。
使用@DateTimeFormat注解設(shè)置日期類(lèi)型數(shù)據(jù)格式,默認(rèn)格式y(tǒng)yyy/MM/dd。
@DateTimeFormat注解的pattern屬性中指定了哪種日期格式,前端的日期參數(shù)就必須按照指定的格式傳遞。 后端controller方法中,需要使用Date類(lèi)型或LocalDateTime類(lèi)型,來(lái)封裝傳遞的參數(shù)。
Controller方法:
//日期時(shí)間參數(shù)
@RequestMapping("/dataParam")
public String dataParam(Date date,
@DateTimeFormat(pattern="yyyy-MM-dd") Date date1,
@DateTimeFormat(pattern="yyyy/MM/dd HH:mm:ss") Date date2){
System.out.println("參數(shù)傳遞 date ==> "+date);
System.out.println("參數(shù)傳遞 date1(yyyy-MM-dd) ==> "+date1);
System.out.println("參數(shù)傳遞 date2(yyyy/MM/dd HH:mm:ss) ==> "+date2);
return "{'module':'data param'}";
}Postman測(cè)試:

3.4 JSON參數(shù) 前后端分離后,前端向后臺(tái)會(huì)傳遞JSON格式數(shù)據(jù),進(jìn)行交互。 Postman發(fā)送JSON格式數(shù)據(jù):
服務(wù)端Controller方法接收J(rèn)SON格式數(shù)據(jù):
傳遞json格式的參數(shù),在Controller中會(huì)使用實(shí)體類(lèi)進(jìn)行封裝。 封裝規(guī)則:JSON數(shù)據(jù)鍵名與形參對(duì)象屬性名相同,定義POJO類(lèi)型形參即可接收參數(shù)。需要使用 @RequestBody標(biāo)識(shí)。 @RequestBody注解:將JSON數(shù)據(jù)映射到形參的實(shí)體類(lèi)對(duì)象中(JSON中的key和實(shí)體類(lèi)中的屬性名保持一致) Controller方法:
//5. json參數(shù)
@RequestMapping("/jsonParam")
public String jsonParam(@RequestBody Student student){
return "name = "+student.getName()+
", age = "+student.getAge()+
", address.city = "+student.getAddress().getCity()+
", address.province = "+student.getAddress().getProvince();
}Postman測(cè)試:

3.5路徑參數(shù) 傳統(tǒng)的開(kāi)發(fā)中請(qǐng)求參數(shù)是放在請(qǐng)求體(POST請(qǐng)求)傳遞或跟在URL后面通過(guò)?key=value的形式傳遞(GET請(qǐng)求)。
在現(xiàn)在的開(kāi)發(fā)中,經(jīng)常還會(huì)直接在請(qǐng)求的URL中傳遞參數(shù)。例如:
http://localhost:8080/path/1 http://localhost:880/path/1/0
路徑參數(shù):
前端:通過(guò)請(qǐng)求URL直接傳遞參數(shù) 后端:使用{…}來(lái)標(biāo)識(shí)該路徑參數(shù),需要使用@PathVariable獲取路徑參數(shù)
Controller方法:
//路徑參數(shù)
@RequestMapping("/path/{id}")
public String pathParam(@PathVariable Integer id){
return "id = "+id;
}Postman測(cè)試:

傳遞多個(gè)路徑參數(shù):
Controller方法:

二、響應(yīng)
2.1 @ResponseBody 前面所編寫(xiě)的controller方法中,都已經(jīng)設(shè)置了響應(yīng)數(shù)據(jù)。
思考:controller方法中的return的結(jié)果,怎么就可以響應(yīng)給瀏覽器呢?
答案:使用@ResponseBody注解
@ResponseBody注解:
類(lèi)型:方法注解、類(lèi)注解 位置:書(shū)寫(xiě)在Controller方法上或類(lèi)上 作用:將方法返回值直接響應(yīng)給瀏覽器 如果返回值類(lèi)型是實(shí)體對(duì)象/集合,將會(huì)轉(zhuǎn)換為JSON格式后在響應(yīng)給瀏覽器 但是在Controller中,只在類(lèi)上添加了@RestController注解、方法添加了@RequestMapping注解,并沒(méi)有使用@ResponseBody注解,怎么給瀏覽器響應(yīng)呢?
原因是在類(lèi)上添加的@RestController注解,是一個(gè)組合注解。
@RestController = @Controller + @ResponseBody 在類(lèi)上添加@RestController就相當(dāng)于添加了@ResponseBody注解。
類(lèi)上有@RestController注解或@ResponseBody注解時(shí):表示當(dāng)前類(lèi)下所有的方法返回值做為響應(yīng)數(shù)據(jù) 方法的返回值,如果是一個(gè)POJO對(duì)象或集合時(shí),會(huì)先轉(zhuǎn)換為JSON格式,在響應(yīng)給瀏覽器。 下面測(cè)試響應(yīng)數(shù)據(jù):
@RestController
public class ResponseController {
@RequestMapping("/study")
public String study(){
return "根據(jù)SpringBoot開(kāi)發(fā)實(shí)戰(zhàn)學(xué)習(xí)SpringBoot";
}
//響應(yīng)實(shí)體對(duì)象
@RequestMapping("/getAddr")
public Address getAddr(){
Address addr = new Address();//創(chuàng)建實(shí)體類(lèi)對(duì)象
addr.setProvince("湖南");
addr.setCity("衡陽(yáng)");
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("衡陽(yáng)");
Address addr2 = new Address();
addr2.setProvince("湖南");
addr2.setCity("長(zhǎng)沙");
list.add(addr);
list.add(addr2);
return list;
}
}postman測(cè)試:



2.2 統(tǒng)一響應(yīng)結(jié)果 開(kāi)發(fā)項(xiàng)目中,controller方法會(huì)定義一個(gè)統(tǒng)一的返回結(jié)果。方案如下:
統(tǒng)一的返回結(jié)果使用類(lèi)來(lái)描述,包含:
響應(yīng)狀態(tài)碼:當(dāng)前請(qǐng)求是成功,還是失敗 狀態(tài)碼信息:給頁(yè)面的提示信息 返回的數(shù)據(jù):給前端響應(yīng)的數(shù)據(jù)(字符串、對(duì)象、集合) 定義在一個(gè)實(shí)體類(lèi)Result來(lái)統(tǒng)一響應(yīng)結(jié)果,代碼如下:
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Result {
private Integer code;
private String message;
private Object data;
public static Result success(Object data) {
return new Result(200, "success", data);
}
public static Result success() {
return new Result(200, "success", null);
}
public static Result error(String message) {
return new Result(500, message, null);
}
public static Result error(Integer code, String message) {
return new Result(code, message, null);
}
}改造Controller:
@RestController
public class StudentController {
@RequestMapping("/stu_study")
public Result study(){
return Result.success( "根據(jù)SpringBoot開(kāi)發(fā)實(shí)戰(zhàn)學(xué)習(xí)SpringBoot");
}
//響應(yīng)實(shí)體對(duì)象
@RequestMapping("/stu_getAddr")
public Result getAddr(){
Address addr = new Address();//創(chuàng)建實(shí)體類(lèi)對(duì)象
addr.setProvince("湖南");
addr.setCity("衡陽(yáng)");
return Result.success(addr);
}
//響應(yīng)集合數(shù)據(jù)
@RequestMapping("/stu_listAddr")
public Result listAddr(){
List<Address> list = new ArrayList<>();//集合對(duì)象
Address addr = new Address();
addr.setProvince("湖南");
addr.setCity("衡陽(yáng)");
Address addr2 = new Address();
addr2.setProvince("湖南");
addr2.setCity("長(zhǎng)沙");
list.add(addr);
list.add(addr2);
return Result.success(list);
}
}使用Postman測(cè)試:



前端只需要按照統(tǒng)一格式的返回結(jié)果進(jìn)行解析。
到此這篇關(guān)于SpringBoot請(qǐng)求與響應(yīng)實(shí)例全解析的文章就介紹到這了,更多相關(guān)springboot請(qǐng)求與響應(yīng)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot Actuator跟蹤HTTP請(qǐng)求和響應(yīng)的方法
- springboot filter實(shí)現(xiàn)請(qǐng)求響應(yīng)全鏈路攔截
- 運(yùn)行SpringBoot項(xiàng)目請(qǐng)求響應(yīng)流程分析以及404和500報(bào)錯(cuò)的解決辦法
- SpringBoot?Web請(qǐng)求響應(yīng)詳細(xì)代碼示例
- SpringBoot請(qǐng)求響應(yīng)方式示例詳解
- 使用springboot aop記錄接口請(qǐng)求的參數(shù)及響應(yīng)
- SpringBoot請(qǐng)求參數(shù)加密、響應(yīng)參數(shù)解密的實(shí)現(xiàn)
- SpringBoot3 響應(yīng)式網(wǎng)絡(luò)請(qǐng)求客戶(hù)端的實(shí)現(xiàn)
- SpringBoot接收與響應(yīng)xml報(bào)文請(qǐng)求的實(shí)現(xiàn)
相關(guān)文章
Mybatis3中方法返回生成的主鍵:XML,@SelectKey,@Options詳解
這篇文章主要介紹了Mybatis3中方法返回生成的主鍵:XML,@SelectKey,@Options,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01
SpringBoot測(cè)試之@SpringBootTest與MockMvc的實(shí)戰(zhàn)應(yīng)用小結(jié)
本文將深入探討SpringBoot測(cè)試中兩個(gè)核心工具:@SpringBootTest注解與MockMvc測(cè)試框架的實(shí)戰(zhàn)應(yīng)用,幫助開(kāi)發(fā)者構(gòu)建更穩(wěn)健的測(cè)試體系,提高代碼質(zhì)量與可維護(hù)性,感興趣的朋友一起看看吧2025-03-03
Springboot結(jié)合@validated優(yōu)化代碼驗(yàn)證
這篇文章主要介紹了Springboot與@validated注解結(jié)合從而實(shí)現(xiàn)讓你的代碼驗(yàn)證更清爽,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08
Springboot使用sharedingjdbc實(shí)現(xiàn)分庫(kù)分表
這篇文章主要介紹了Springboot使用sharedingjdbc實(shí)現(xiàn)分庫(kù)分表,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07
淺析JAVA常用JDBC連接數(shù)據(jù)庫(kù)的方法總結(jié)
本篇文章是對(duì)在JAVA中常用JDBC連接數(shù)據(jù)庫(kù)的方法進(jìn)行了詳細(xì)的總結(jié)分析,需要的朋友參考下2013-07-07
java如何在應(yīng)用代碼里捕獲線(xiàn)程堆棧
這篇文章主要為大家介紹了java如何在應(yīng)用代碼里捕獲線(xiàn)程堆棧實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12
Java?定時(shí)任務(wù)技術(shù)趨勢(shì)詳情
這篇文章主要介紹了Java?定時(shí)任務(wù)技術(shù)趨勢(shì)詳情,定時(shí)任務(wù)是每個(gè)業(yè)務(wù)常見(jiàn)的需求,比如每分鐘掃描超時(shí)支付的訂單,每小時(shí)清理一次數(shù)據(jù)庫(kù)歷史數(shù)據(jù),每天統(tǒng)計(jì)前一天的數(shù)據(jù)并生成報(bào)表等,下文更多相關(guān)資料,需要的小伙伴可以參考一下2022-05-05

