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)下面是一個簡單的測試樣例:
2,參數(shù)沒有傳遞的情況
(1)如果沒有傳遞參數(shù) Controller 將會報錯,這個同樣有如下兩種解決辦法:
- 使用 required = false 標(biāo)注參數(shù)是非必須的。
- 使用 defaultValue 給參數(shù)指定個默認(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 來接收參數(shù)
(1)Controller 還可以直接使用 map 來接收所有的請求參數(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)下面是一個簡單的測試樣例:
4,接收一個數(shù)組
(1)表單中有多個同名參數(shù),Controller 這邊可以定義一個數(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)下面是一個簡單的測試樣例:
5,使用對象來接收參數(shù)
1)如果一個 post 請求的參數(shù)太多,我們構(gòu)造一個對象來簡化參數(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ù)通過 getter、setter 方法注入到對象中去:
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)下面是一個簡單的測試樣例:
(4)如果傳遞的參數(shù)有前綴,且前綴與接收實體類的名稱相同,那么參數(shù)也是可以正常傳遞的:
(5)如果一個 post 請求的參數(shù)分屬不同的對象,也可以使用多個對象來接收參數(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,使用對象接收時指定參數(shù)前綴
(1)如果傳遞的參數(shù)有前綴,且前綴與接收實體類的名稱不同相,那么參數(shù)無法正常傳遞:
(2)我們可以結(jié)合 @InitBinder 解決這個問題,通過參數(shù)預(yù)處理來指定使用的前綴為 u.
除了在 Controller 里單獨定義預(yù)處理方法外,我們還可以通過 @ControllerAdvice 結(jié)合 @InitBinder 來定義全局的參數(shù)預(yù)處理方法,方便各個 Controller 使用。具體做法參考我之前的文章:
SpringBoot - @ControllerAdvice的使用詳解3(請求參數(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ā)送請求,可以看到參數(shù)已經(jīng)成功接收了:
二、接收字符串文本數(shù)據(jù)
(1)如果傳遞過來的是 Text 文本,我們可以通過 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 來接收數(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)下面是一個簡單的測試樣例:
2,使用 Bean 對象來接收數(shù)據(jù)
(1)如果把 json 作為參數(shù)傳遞,我們可以使用 @requestbody 接收參數(shù),將數(shù)據(jù)直接轉(zhuǎn)換成對象:
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)下面是一個簡單的測試樣例:
(4)如果傳遞的 JOSN 數(shù)據(jù)是一個數(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 實現(xiàn)分頁查詢的示例代碼
本文介紹了在MyBatis-Plus中實現(xiàn)分頁查詢,包括引入依賴、配置分頁插件、使用分頁查詢以及在控制器中調(diào)用分頁查詢的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-11-11使用springmvc運行流程分析,手寫spring框架嘗試
這篇文章主要介紹了使用springmvc運行流程分析,手寫spring框架嘗試,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10Ubuntu安裝jenkins完成自動化構(gòu)建詳細(xì)步驟
Jenkins是一個開源的自動化服務(wù)器,可以用來輕松地建立持續(xù)集成和持續(xù)交付(CI/CD)管道,這篇文章主要給大家介紹了關(guān)于Ubuntu安裝jenkins完成自動化構(gòu)建的相關(guān)資料,需要的朋友可以參考下2024-03-03詳解Java創(chuàng)建多線程的四種方式以及優(yōu)缺點
這篇文章主要介紹了Java創(chuàng)建多線程的四種方式以及優(yōu)缺點,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11java統(tǒng)計漢字字?jǐn)?shù)的方法示例
這篇文章主要介紹了java統(tǒng)計漢字字?jǐn)?shù)的方法,結(jié)合實例形式分析了java正則判定、字符串遍歷及統(tǒng)計相關(guān)操作技巧,需要的朋友可以參考下2017-05-05詳解java中String、StringBuilder、StringBuffer的區(qū)別
這篇文章主要介紹了java中String、StringBuilder、StringBuffer的區(qū)別,文中講解的很清晰,有對于這方面不太懂的同學(xué)可以研究下2021-02-02