欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2025年05月09日 14:48:33   作者:求求你了再讓我寫寫java  
Spring Boot提供了強大的機制來處理不同 Content-Type? 的HTTP請求體,這主要依賴于 HttpMessageConverter? 接口的各種實現(xiàn),它們能夠自動將請求體內(nèi)容轉(zhuǎn)換成Java方法參數(shù),本文給大家介紹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)文章

  • Java經(jīng)典面試題最全匯總208道(三)

    Java經(jīng)典面試題最全匯總208道(三)

    這篇文章主要介紹了Java經(jīng)典面試題最全匯總208道(三),本文章內(nèi)容詳細,該模塊分為了六個部分,本次為第三部分,需要的朋友可以參考下
    2023-01-01
  • Java由淺入深分析多態(tài)的概念

    Java由淺入深分析多態(tài)的概念

    多態(tài)就是指程序中定義的引用變量所指向的具體類型和通過該引用變量發(fā)出的方法調(diào)用在編程時并不確定,而是在程序運行期間才確定,即一個引用變量到底會指向哪個類的實例對象,該引用變量發(fā)出的方法調(diào)用到底是哪個類中實現(xiàn)的方法,必須在由程序運行期間才能決定
    2022-04-04
  • javaweb實現(xiàn)app掃碼登錄功能

    javaweb實現(xiàn)app掃碼登錄功能

    這篇文章主要為大家詳細介紹了javaweb實現(xiàn)app掃碼登錄功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-10-10
  • springboot整合shardingjdbc實現(xiàn)分庫分表最簡單demo

    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)及優(yōu)勢詳解

    這篇文章主要為大家介紹了tio-http-server打包為二進制文件實現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12
  • Spring boot項目打包成jar運行的二種方法

    Spring boot項目打包成jar運行的二種方法

    這篇文章主要給大家介紹了關(guān)于Spring boot項目打包成jar運行的二種方法,文中通過示例代碼介紹的非常詳細,對大家學習或者使用spring boot具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-11-11
  • Java中關(guān)于int和Integer的區(qū)別詳解

    Java中關(guān)于int和Integer的區(qū)別詳解

    本篇文章小編為大家介紹,在Java中 關(guān)于int和Integer的區(qū)別詳解,需要的朋友參考下
    2013-04-04
  • Mybatis分頁插件PageHelper的分頁原理剖析

    Mybatis分頁插件PageHelper的分頁原理剖析

    這篇文章主要介紹了Mybatis分頁插件PageHelper的分頁原理剖析,PageHelper作為一個啟動器,那么就和其他啟動器加載一樣,先讀取spring.factories文件里面配置的類,轉(zhuǎn)成Bean加載本系統(tǒng)中,然后執(zhí)行他的前置后置處理方法,完成初始化,需要的朋友可以參考下
    2023-08-08
  • 劍指Offer之Java算法習題精講數(shù)組與字符串

    劍指Offer之Java算法習題精講數(shù)組與字符串

    跟著思路走,之后從簡單題入手,反復去看,做過之后可能會忘記,之后再做一次,記不住就反復做,反復尋求思路和規(guī)律,慢慢積累就會發(fā)現(xiàn)質(zhì)的變化
    2022-03-03
  • 關(guān)于微服務(wù)使用Dubbo設(shè)置的端口和server.port的區(qū)別

    關(guān)于微服務(wù)使用Dubbo設(shè)置的端口和server.port的區(qū)別

    這篇文章主要介紹了關(guān)于微服務(wù)使用Dubbo設(shè)置的端口和server.port的區(qū)別,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12

最新評論