最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring Boot Controller處理HTTP請求體的方法

 更新時(shí)間:2025年05月09日 14:48:33   作者:求求你了再讓我寫寫java  
Spring Boot提供了強(qiáng)大的機(jī)制來處理不同 Content-Type? 的HTTP請求體,這主要依賴于 HttpMessageConverter? 接口的各種實(shí)現(xiàn),它們能夠自動將請求體內(nèi)容轉(zhuǎn)換成Java方法參數(shù),本文給大家介紹Spring Boot Controller處理HTTP請求體的方法,感興趣的朋友一起看看吧

Spring Boot (通過Spring MVC) 提供了強(qiáng)大的機(jī)制來處理不同 Content-Type? 的HTTP請求體。這主要依賴于 HttpMessageConverter? 接口的各種實(shí)現(xiàn),它們能夠自動將請求體內(nèi)容轉(zhuǎn)換成Java方法參數(shù)。

一、核心機(jī)制: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?
  • 目標(biāo)類型: 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")?
    • 目標(biāo)類型: 基本類型 (String?, int?, etc.)
    • 示例:
@PostMapping("/login")
public String login(@RequestParam String username, @RequestParam String password) {
    // username 和 password 從表單數(shù)據(jù)填充
    // ...
}
  • 方式二:直接綁定到POJO (無需 @RequestBody?)
    • 目標(biāo)類型: 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?
  • 目標(biāo)類型: 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 處理復(fù)雜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?
  • 目標(biāo)類型: String?
  • 示例:
@PostMapping("/logs")
public void submitLog(@RequestBody String logEntry) {
    // logEntry 包含請求體中的純文本
    System.out.println(logEntry);
}

5. application/xml?

  • 注解: @RequestBody?
  • 目標(biāo)類型: 用JAXB注解的POJO (e.g., @XmlRootElement?)
  • 依賴: 通常需要 jaxb-api? 和實(shí)現(xiàn) (如 org.glassfish.jaxb:jaxb-runtime?)。Spring Boot的 spring-boot-starter-web? 默認(rèn)可能不直接包含完整的JAXB運(yùn)行時(shí),需要時(shí)可添加。
  • 示例:
// 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? (或其他二進(jìn)制數(shù)據(jù))

  • 注解: @RequestBody?
  • 目標(biāo)類型: byte[]?
  • 示例:
@PostMapping(value = "/data", consumes = "application/octet-stream")
public String processBinaryData(@RequestBody byte[] data) {
    // data 包含原始二進(jìn)制數(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語法錯誤)。

四、自定義與擴(kuò)展

開發(fā)者可以注冊自定義的 HttpMessageConverter? 來支持非標(biāo)準(zhǔn)或特定的數(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)換器,同時(shí)不影響默認(rèn)注冊的轉(zhuǎn)換器
//         // 或者調(diào)整已注冊轉(zhuǎn)換器的順序
//     }
// }

理解這些機(jī)制對于構(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)文章

  • spring boot實(shí)現(xiàn)過濾器和攔截器demo

    spring boot實(shí)現(xiàn)過濾器和攔截器demo

    本篇文章主要介紹了spring boot實(shí)現(xiàn)過濾器和攔截器demo ,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-02-02
  • Java中equals和hashcode用法

    Java中equals和hashcode用法

    `equals`和`hashCode`方法在Java中密切相關(guān),必須保持一致性,如果兩個對象通過`equals`方法相等,它們的`hashCode`也必須相同,這對于基于哈希的數(shù)據(jù)結(jié)構(gòu)至關(guān)重要,因?yàn)檫@些結(jié)構(gòu)依賴哈希值進(jìn)行快速查找和存儲,為了減少哈希沖突
    2025-01-01
  • java數(shù)據(jù)隨機(jī)分頁實(shí)現(xiàn)方案

    java數(shù)據(jù)隨機(jī)分頁實(shí)現(xiàn)方案

    本文主要介紹了java數(shù)據(jù)隨機(jī)分頁實(shí)現(xiàn)方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • 解決get請求入?yún)NotNull驗(yàn)證不生效問題

    解決get請求入?yún)NotNull驗(yàn)證不生效問題

    這篇文章主要介紹了解決get請求入?yún)NotNull驗(yàn)證不生效問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • java實(shí)現(xiàn)簡單快遞系統(tǒng)

    java實(shí)現(xiàn)簡單快遞系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡單快遞系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • SpringBoot集成Swagger2的方法

    SpringBoot集成Swagger2的方法

    這篇文章主要介紹了SpringBoot集成Swagger2的方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12
  • Mybatis源碼解析之初始化分析

    Mybatis源碼解析之初始化分析

    這篇文章主要介紹了Mybatis源碼解析之初始化分析,Mybatis的初始化過程就是mybatis配置文件的解析過程并將解析結(jié)果保存到Configuration類。,需要的朋友可以參考下
    2024-01-01
  • SpringBoot 集成 Statemachine的實(shí)戰(zhàn)指南

    SpringBoot 集成 Statemachine的實(shí)戰(zhàn)指南

    本文介紹了Spring State Machine框架的基本概念、核心特性、注解驅(qū)動開發(fā)方式以及如何在Spring Boot項(xiàng)目中集成狀態(tài)機(jī),通過狀態(tài)機(jī),可以有效地管理復(fù)雜的狀態(tài)流轉(zhuǎn)邏輯,文章還討論了狀態(tài)機(jī)的持久化問題,并提供了一個自定義持久化實(shí)現(xiàn)的示例,感興趣的朋友跟隨小編一起看看吧
    2026-01-01
  • mybatis中數(shù)據(jù)加密與解密的實(shí)現(xiàn)

    mybatis中數(shù)據(jù)加密與解密的實(shí)現(xiàn)

    數(shù)據(jù)加解密的實(shí)現(xiàn)方式多種多樣,在mybatis環(huán)境中數(shù)據(jù)加解密變得非常簡單易用,本文主要介紹了mybatis中數(shù)據(jù)加密與解密的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Java讀寫.properties文件解決中文亂碼問題

    Java讀寫.properties文件解決中文亂碼問題

    這篇文章主要介紹了Java讀寫.properties文件解決中文亂碼問題,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2017-11-11

最新評論

新沂市| 遂昌县| 义乌市| 福清市| 兴海县| 景谷| 襄汾县| 垣曲县| 兰坪| 剑河县| 罗甸县| 莲花县| 洮南市| 麻阳| 合阳县| 柳江县| 扎兰屯市| 兴和县| 辰溪县| 肥城市| 无极县| 瓮安县| 巴林左旗| 隆安县| 芒康县| 会同县| 福海县| 普陀区| 涡阳县| 库尔勒市| 苏尼特右旗| 名山县| 西乡县| 涪陵区| 沽源县| 清水河县| 宁波市| 益阳市| 临武县| 廉江市| 咸阳市|