Springboot 接收POST、json、文本數(shù)據(jù)的方法 附示例
一、接收 Form 表單數(shù)據(jù)
1,基本的接收方法
(1)下面樣例 Controller 接收 form-data 格式的 POST 數(shù)據(jù):
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @RestController public class HelloController { @PostMapping("/postHello1") public String postHello1(@RequestParam("name") String name, @RequestParam("age") Integer age) { return "name:" + name + "\nage:" + age; } }
(2)下面是一個(gè)簡(jiǎn)單的測(cè)試樣例:
2,參數(shù)沒(méi)有傳遞的情況
(1)如果沒(méi)有傳遞參數(shù) Controller 將會(huì)報(bào)錯(cuò),這個(gè)同樣有如下兩種解決辦法:
- 使用 required = false 標(biāo)注參數(shù)是非必須的。
- 使用 defaultValue 給參數(shù)指定個(gè)默認(rèn)值。
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @RestController public class HelloController { @PostMapping("/postHello2") public String postHello2(@RequestParam(name = "name", defaultValue = "xxx") String name, @RequestParam(name = "age", required = false) Integer age) { return "name:" + name + "\nage:" + age; } }
3,使用 map 來(lái)接收參數(shù)
(1)Controller 還可以直接使用 map 來(lái)接收所有的請(qǐng)求參數(shù):
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import java.util.Map; @RestController public class HelloController { @PostMapping("/postHello3") public String postHello3(@RequestParam Map<String,Object> params) { return "name:" + params.get("name") + "\nage:" + params.get("age"); } }
(2)下面是一個(gè)簡(jiǎn)單的測(cè)試樣例:
4,接收一個(gè)數(shù)組
(1)表單中有多個(gè)同名參數(shù),Controller 這邊可以定義一個(gè)數(shù)據(jù)進(jìn)行接收:
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import java.util.Map; @RestController public class HelloController { @PostMapping("/postHello4") public String postHello4(@RequestParam("name") String[] names) { String result = ""; for(String name:names){ result += name + "\n"; } return result;
(2)下面是一個(gè)簡(jiǎn)單的測(cè)試樣例:
5,使用對(duì)象來(lái)接收參數(shù)
1)如果一個(gè) post 請(qǐng)求的參數(shù)太多,我們構(gòu)造一個(gè)對(duì)象來(lái)簡(jiǎn)化參數(shù)的接收方式:
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class HelloController { @PostMapping("/postHello5") public String postHello5(User user) { return "name:" + user.getName() + "\nage:" + user.getAge(); } }
(2)User 類的定義如下,到時(shí)可以直接將多個(gè)參數(shù)通過(guò) getter、setter 方法注入到對(duì)象中去:
public class User { private String name; private Integer age; public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; }
(3)下面是一個(gè)簡(jiǎn)單的測(cè)試樣例:
(4)如果傳遞的參數(shù)有前綴,且前綴與接收實(shí)體類的名稱相同,那么參數(shù)也是可以正常傳遞的:
(5)如果一個(gè) post 請(qǐng)求的參數(shù)分屬不同的對(duì)象,也可以使用多個(gè)對(duì)象來(lái)接收參數(shù):
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class HelloController { @PostMapping("/postHello5-1") public String hello(User user, Phone phone) { return "name:" + user.getName() + "\nage:" + user.getAge() + "\nnumber:" + phone.getNumber(); } }
6,使用對(duì)象接收時(shí)指定參數(shù)前綴
(1)如果傳遞的參數(shù)有前綴,且前綴與接收實(shí)體類的名稱不同相,那么參數(shù)無(wú)法正常傳遞:
(2)我們可以結(jié)合 @InitBinder 解決這個(gè)問(wèn)題,通過(guò)參數(shù)預(yù)處理來(lái)指定使用的前綴為 u.
除了在 Controller 里單獨(dú)定義預(yù)處理方法外,我們還可以通過(guò) @ControllerAdvice 結(jié)合 @InitBinder 來(lái)定義全局的參數(shù)預(yù)處理方法,方便各個(gè) Controller 使用。具體做法參考我之前的文章:
SpringBoot - @ControllerAdvice的使用詳解3(請(qǐng)求參數(shù)預(yù)處理 @InitBinder)
import org.springframework.web.bind.WebDataBinder; import org.springframework.web.bind.annotation.*; @RestController public class HelloController { @PostMapping("/postHello6") public String postHello6(@ModelAttribute("u") User user) { return "name:" + user.getName() + "\nage:" + user.getAge(); } @InitBinder("u") private void initBinder(WebDataBinder binder) { binder.setFieldDefaultPrefix("u."); } }
(3)重啟程序再次發(fā)送請(qǐng)求,可以看到參數(shù)已經(jīng)成功接收了:
二、接收字符串文本數(shù)據(jù)
(1)如果傳遞過(guò)來(lái)的是 Text 文本,我們可以通過(guò) HttpServletRequest 獲取輸入流從而讀取文本內(nèi)容。
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RestController; import javax.servlet.ServletInputStream; import javax.servlet.http.HttpServletRequest; import java.io.IOException; @RestController public class HelloController { @PostMapping("/helloText") public String hello(HttpServletRequest request) { ServletInputStream is = null; try { is = request.getInputStream(); StringBuilder sb = new StringBuilder();
三、接收 JSON 數(shù)據(jù)
1,使用 Map 來(lái)接收數(shù)據(jù)
(1)如果把 json 作為參數(shù)傳遞,我們可以使用 @requestbody 接收參數(shù),將數(shù)據(jù)轉(zhuǎn)換 Map:
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; import java.util.Map; @RestController public class HelloController { @PostMapping("/helloMap") public String helloMap(@RequestBody Map params) { return "name:" + params.get("name") + "\n age:" + params.get("age"); } }
(2)下面是一個(gè)簡(jiǎn)單的測(cè)試樣例:
2,使用 Bean 對(duì)象來(lái)接收數(shù)據(jù)
(1)如果把 json 作為參數(shù)傳遞,我們可以使用 @requestbody 接收參數(shù),將數(shù)據(jù)直接轉(zhuǎn)換成對(duì)象:
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; @RestController public class HelloController { @PostMapping("/helloBean") public String hello(@RequestBody User user){ return user.getName() + " " + user.getAge(); } }
(2)下面是一個(gè)簡(jiǎn)單的測(cè)試樣例:
(4)如果傳遞的 JOSN 數(shù)據(jù)是一個(gè)數(shù)組也是可以的,Controller 做如下修改:
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; import java.util.List; @RestController public class HelloController { @PostMapping("/helloList") public String helloList(@RequestBody List<User> users){ String result = ""; for(User user:users){ result += user.getName() + " " + user.getAge() + "\n"; } return result;
相關(guān)文章
mybatis-plus 實(shí)現(xiàn)分頁(yè)查詢的示例代碼
本文介紹了在MyBatis-Plus中實(shí)現(xiàn)分頁(yè)查詢,包括引入依賴、配置分頁(yè)插件、使用分頁(yè)查詢以及在控制器中調(diào)用分頁(yè)查詢的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-11-11使用springmvc運(yùn)行流程分析,手寫(xiě)spring框架?chē)L試
這篇文章主要介紹了使用springmvc運(yùn)行流程分析,手寫(xiě)spring框架?chē)L試,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10Java使用單鏈表實(shí)現(xiàn)約瑟夫環(huán)
這篇文章主要為大家詳細(xì)介紹了Java使用單鏈表實(shí)現(xiàn)約瑟夫環(huán),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10Ubuntu安裝jenkins完成自動(dòng)化構(gòu)建詳細(xì)步驟
Jenkins是一個(gè)開(kāi)源的自動(dòng)化服務(wù)器,可以用來(lái)輕松地建立持續(xù)集成和持續(xù)交付(CI/CD)管道,這篇文章主要給大家介紹了關(guān)于Ubuntu安裝jenkins完成自動(dòng)化構(gòu)建的相關(guān)資料,需要的朋友可以參考下2024-03-03詳解Java創(chuàng)建多線程的四種方式以及優(yōu)缺點(diǎn)
這篇文章主要介紹了Java創(chuàng)建多線程的四種方式以及優(yōu)缺點(diǎn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11java統(tǒng)計(jì)漢字字?jǐn)?shù)的方法示例
這篇文章主要介紹了java統(tǒng)計(jì)漢字字?jǐn)?shù)的方法,結(jié)合實(shí)例形式分析了java正則判定、字符串遍歷及統(tǒng)計(jì)相關(guān)操作技巧,需要的朋友可以參考下2017-05-05Java OpenCV實(shí)現(xiàn)人臉識(shí)別過(guò)程詳解
這篇文章主要介紹了Java OpenCV實(shí)現(xiàn)人臉識(shí)別過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08詳解java中String、StringBuilder、StringBuffer的區(qū)別
這篇文章主要介紹了java中String、StringBuilder、StringBuffer的區(qū)別,文中講解的很清晰,有對(duì)于這方面不太懂的同學(xué)可以研究下2021-02-02