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 類(lèi)的定義如下,到時(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í)體類(lèi)的名稱(chēng)相同,那么參數(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í)體類(lèi)的名稱(chēng)不同相,那么參數(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)文章
Java如何實(shí)現(xiàn)對(duì)稱(chēng)加密
這篇文章主要介紹了Java如何實(shí)現(xiàn)對(duì)稱(chēng)加密問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11
Java最簡(jiǎn)單的DES加密算法實(shí)現(xiàn)案例
下面小編就為大家?guī)?lái)一篇Java最簡(jiǎn)單的DES加密算法實(shí)現(xiàn)案例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-06-06
解決okhttp3提示java.lang.IllegalStateException:closed異常問(wèn)題
使用OkHttp3時(shí),response.body().string()只能調(diào)用一次,重復(fù)調(diào)用會(huì)導(dǎo)致流關(guān)閉異常,解決方法是保存響應(yīng)體內(nèi)容到變量或重新構(gòu)建Response對(duì)象,避免多次讀取2025-07-07
Java實(shí)現(xiàn)圖片上文字內(nèi)容的動(dòng)態(tài)修改的操作步驟
在數(shù)字圖像處理領(lǐng)域,Java提供了強(qiáng)大的庫(kù)來(lái)處理圖片,包括讀取、修改和寫(xiě)入圖片,如果你需要在Java應(yīng)用程序中修改圖片上的文字內(nèi)容,可以通過(guò)圖像處理技術(shù)來(lái)實(shí)現(xiàn),這篇博文將介紹如何使用Java實(shí)現(xiàn)圖片上文字內(nèi)容的動(dòng)態(tài)修改,需要的朋友可以參考下2024-07-07
Java通俗易懂系列設(shè)計(jì)模式之責(zé)任鏈模式
這篇文章主要介紹了Java通俗易懂系列設(shè)計(jì)模式之責(zé)任鏈模式,對(duì)設(shè)計(jì)模式感興趣的同學(xué),一定要看一下2021-04-04

