Spring Boot Controller處理HTTP請求體的方法
Spring Boot (通過Spring MVC) 提供了強大的機制來處理不同 Content-Type? 的HTTP請求體。這主要依賴于 HttpMessageConverter? 接口的各種實現(xiàn),它們能夠自動將請求體內(nèi)容轉(zhuǎn)換成Java方法參數(shù)。
一、核心機制:HttpMessageConverter?
Spring MVC會根據(jù)請求頭中的 Content-Type? 和Controller方法參數(shù)的類型,選擇一個合適的 HttpMessageConverter? 來執(zhí)行數(shù)據(jù)轉(zhuǎn)換。常見的轉(zhuǎn)換器包括:
- ?MappingJackson2HttpMessageConverter?: 處理 application/json?,將JSON數(shù)據(jù)綁定到POJO。
- ?FormHttpMessageConverter?: 處理 application/x-www-form-urlencoded?,可以將表單數(shù)據(jù)綁定到POJO或 MultiValueMap?。
- ?Jaxb2RootElementHttpMessageConverter?: 處理 application/xml?,將XML數(shù)據(jù)綁定到用JAXB注解的POJO。
- ?ByteArrayHttpMessageConverter?: 處理原始字節(jié)流,綁定到 byte[]?。
- ?StringHttpMessageConverter?: 處理純文本,綁定到 String?。
- ?StandardServletMultipartResolver? (配合相關(guān)轉(zhuǎn)換器): 處理 multipart/form-data?,通常用于文件上傳,將文件部分綁定到 MultipartFile?。
二、按Content-Type?處理詳解
1. application/json?
- 注解: @RequestBody?
- 目標類型: POJO (Plain Old Java Object)
- 示例:
// POJO
// public class User {
// private String username;
// private String email;
// // getters and setters
// }
@PostMapping("/users")
public User createUser(@RequestBody User user) {
// user 對象已從JSON填充
return userService.save(user);
}說明: 請求體中的JSON字符串會被自動映射到 User? 對象的字段。
2. application/x-www-form-urlencoded?
- 方式一:使用 @RequestParam? 逐個接收
- 注解: @RequestParam("paramName")?
- 目標類型: 基本類型 (String?, int?, etc.)
- 示例:
@PostMapping("/login")
public String login(@RequestParam String username, @RequestParam String password) {
// username 和 password 從表單數(shù)據(jù)填充
// ...
}- 方式二:直接綁定到POJO (無需 @RequestBody?)
- 目標類型: POJO
- 說明: 表單字段名需與POJO屬性名匹配。
- 示例:
// POJO
// public class RegistrationForm {
// private String username;
// private String password;
// // getters and setters
// }
@PostMapping("/register")
public String register(RegistrationForm form) {
// form 對象已從表單數(shù)據(jù)填充
// ...
}3. multipart/form-data? (常用于文件上傳)
- 注解: @RequestParam? 或 @RequestPart?
- 目標類型: MultipartFile? (用于文件), 其他表單字段可以是基本類型或POJO。
- 配置: 可能需要在 application.properties? 中啟用和配置multipart處理:
spring.servlet.multipart.enabled=true spring.servlet.multipart.max-file-size=10MB spring.servlet.multipart.max-request-size=10MB
示例:
@PostMapping("/upload/profile")
public String uploadProfile(@RequestParam("userId") Long userId,
@RequestParam("image") MultipartFile imageFile) throws IOException {
// userId 是普通表單字段
// imageFile 是上傳的文件
String fileName = imageFile.getOriginalFilename();
// ... 保存文件 ...
return "File " + fileName + " uploaded for user " + userId;
}
// 使用 @RequestPart 處理復雜multipart (例如,一個部分是JSON)
@PostMapping("/upload/advanced")
public String advancedUpload(@RequestPart("metadata") UserMetadata metadata, // UserMetadata 是一個POJO
@RequestPart("document") MultipartFile document) {
// metadata 從一個JSON part解析
// document 是文件 part
// ...
return "Advanced upload successful.";
}4. text/plain?
- 注解: @RequestBody?
- 目標類型: String?
- 示例:
@PostMapping("/logs")
public void submitLog(@RequestBody String logEntry) {
// logEntry 包含請求體中的純文本
System.out.println(logEntry);
}5. application/xml?
- 注解: @RequestBody?
- 目標類型: 用JAXB注解的POJO (e.g., @XmlRootElement?)
- 依賴: 通常需要 jaxb-api? 和實現(xiàn) (如 org.glassfish.jaxb:jaxb-runtime?)。Spring Boot的 spring-boot-starter-web? 默認可能不直接包含完整的JAXB運行時,需要時可添加。
- 示例:
// POJO (用JAXB注解)
// @XmlRootElement(name = "item")
// public class Item {
// @XmlElement public String name;
// @XmlElement public double price;
// }
@PostMapping(value = "/items", consumes = "application/xml", produces = "application/xml")
public Item createItem(@RequestBody Item item) {
// item 對象已從XML填充
return itemService.save(item);
}6. application/octet-stream? (或其他二進制數(shù)據(jù))
- 注解: @RequestBody?
- 目標類型: byte[]?
- 示例:
@PostMapping(value = "/data", consumes = "application/octet-stream")
public String processBinaryData(@RequestBody byte[] data) {
// data 包含原始二進制數(shù)據(jù)
System.out.println("Received " + data.length + " bytes.");
return "Binary data processed.";
}或者直接使用 InputStream? (通常不帶 @RequestBody?):
@PostMapping(value = "/data-stream", consumes = "application/octet-stream")
public String processDataStream(InputStream inputStream) throws IOException {
// 手動從 inputStream 讀取數(shù)據(jù)
// ...
return "Stream processed.";
}三、錯誤處理
如果請求的 Content-Type? 不被支持,或者請求體格式錯誤(如無效的JSON),Spring Boot 通常會返回:
- HTTP 415 Unsupported Media Type: 如果沒有HttpMessageConverter能處理該 Content-Type?。
- HTTP 400 Bad Request: 如果選擇的HttpMessageConverter無法解析請求體 (例如,JSON語法錯誤)。
四、自定義與擴展
開發(fā)者可以注冊自定義的 HttpMessageConverter? 來支持非標準或特定的數(shù)據(jù)格式,通過配置 WebMvcConfigurer?。
// @Configuration
// public class WebConfig implements WebMvcConfigurer {
// @Override
// public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
// converters.add(new MyCustomMessageConverter());
// }
//
// @Override
// public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
// // 用來添加轉(zhuǎn)換器,同時不影響默認注冊的轉(zhuǎn)換器
// // 或者調(diào)整已注冊轉(zhuǎn)換器的順序
// }
// }理解這些機制對于構(gòu)建健壯和靈活的Spring Boot API至關(guān)重要。
到此這篇關(guān)于Spring Boot Controller 如何處理HTTP請求體的文章就介紹到這了,更多相關(guān)Spring Boot Controller HTTP請求體內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springboot整合shardingjdbc實現(xiàn)分庫分表最簡單demo
我們知道分庫分表是針對某些數(shù)據(jù)量持續(xù)大幅增長的表,比如用戶表、訂單表等,而不是一刀切將全部表都做分片,這篇文章主要介紹了springboot整合shardingjdbc實現(xiàn)分庫分表最簡單demo,需要的朋友可以參考下2021-06-06
tio-http-server打包為二進制文件的實現(xiàn)及優(yōu)勢詳解
這篇文章主要為大家介紹了tio-http-server打包為二進制文件實現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-12-12
Java中關(guān)于int和Integer的區(qū)別詳解
本篇文章小編為大家介紹,在Java中 關(guān)于int和Integer的區(qū)別詳解,需要的朋友參考下2013-04-04
關(guān)于微服務(wù)使用Dubbo設(shè)置的端口和server.port的區(qū)別
這篇文章主要介紹了關(guān)于微服務(wù)使用Dubbo設(shè)置的端口和server.port的區(qū)別,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12

