HTTP 訊息轉換

spring-web 模組包含 HttpMessageConverter 介面,用於透過 InputStreamOutputStream 讀寫 HTTP 請求和響應體。HttpMessageConverter 例項在客戶端(例如,在 RestClient 中)和伺服器端(例如,在 Spring MVC REST 控制器中)使用。

框架提供了主要媒體 (MIME) 型別的具體實現,預設情況下,這些實現會在客戶端(RestClientRestTemplate)和伺服器端(RequestMappingHandlerAdapter)註冊(參見配置訊息轉換器)。

下面描述了 HttpMessageConverter 的幾種實現。有關完整列表,請參閱 HttpMessageConverter Javadoc。對於所有轉換器,都會使用預設媒體型別,但你可以透過設定 supportedMediaTypes 屬性來覆蓋它。

表 1. HttpMessageConverter 實現
訊息轉換器 描述

StringHttpMessageConverter

HttpMessageConverter 的實現類,可以從 HTTP 請求和響應中讀寫 String 例項。預設情況下,此轉換器支援所有 text 媒體型別(text/*),並以 Content-Typetext/plain 寫入。

FormHttpMessageConverter

HttpMessageConverter 的實現類,可以從 HTTP 請求和響應中讀寫表單資料。預設情況下,此轉換器讀寫 application/x-www-form-urlencoded 媒體型別。表單資料讀寫到一個 MultiValueMap<String, String>。此轉換器還可以寫入(但不能讀取)從 MultiValueMap<String, Object> 讀取的 multipart 資料。預設支援 multipart/form-data。對於寫入表單資料,可以支援額外的 multipart 子型別。有關更多詳細資訊,請查閱 FormHttpMessageConverter 的 javadoc。

ByteArrayHttpMessageConverter

HttpMessageConverter 的實現類,可以從 HTTP 請求和響應中讀寫位元組陣列。預設情況下,此轉換器支援所有媒體型別(*/*),並以 Content-Typeapplication/octet-stream 寫入。你可以透過設定 supportedMediaTypes 屬性和覆蓋 getContentType(byte[]) 來覆蓋此行為。

MarshallingHttpMessageConverter

HttpMessageConverter 的實現類,可以使用 Spring 的 org.springframework.oxm 包中的 MarshallerUnmarshaller 抽象讀寫 XML。此轉換器在使用前需要一個 MarshallerUnmarshaller。你可以透過建構函式或 bean 屬性注入它們。預設情況下,此轉換器支援 text/xmlapplication/xml

MappingJackson2HttpMessageConverter

HttpMessageConverter 的實現類,可以使用 Jackson 的 ObjectMapper 讀寫 JSON。你可以透過使用 Jackson 提供的註解來根據需要自定義 JSON 對映。當你需要進一步控制時(例如需要為特定型別提供自定義 JSON 序列化器/反序列化器),可以透過 ObjectMapper 屬性注入自定義的 ObjectMapper。預設情況下,此轉換器支援 application/json。這需要 com.fasterxml.jackson.core:jackson-databind 依賴項。

MappingJackson2XmlHttpMessageConverter

HttpMessageConverter 的實現類,可以使用 Jackson XML 擴充套件的 XmlMapper 讀寫 XML。你可以透過使用 JAXB 或 Jackson 提供的註解來根據需要自定義 XML 對映。當你需要進一步控制時(例如需要為特定型別提供自定義 XML 序列化器/反序列化器),可以透過 ObjectMapper 屬性注入自定義的 XmlMapper。預設情況下,此轉換器支援 application/xml。這需要 com.fasterxml.jackson.dataformat:jackson-dataformat-xml 依賴項。

MappingJackson2CborHttpMessageConverter

com.fasterxml.jackson.dataformat:jackson-dataformat-cbor

SourceHttpMessageConverter

HttpMessageConverter 的實現類,可以從 HTTP 請求和響應中讀寫 javax.xml.transform.Source。僅支援 DOMSourceSAXSourceStreamSource。預設情況下,此轉換器支援 text/xmlapplication/xml

GsonHttpMessageConverter

HttpMessageConverter 的實現類,可以使用 "Google Gson" 讀寫 JSON。這需要 com.google.code.gson:gson 依賴項。

JsonbHttpMessageConverter

HttpMessageConverter 的實現類,可以使用 Jakarta Json Bind API 讀寫 JSON。這需要 jakarta.json.bind:jakarta.json.bind-api 依賴項和一個可用的實現。

ProtobufHttpMessageConverter

HttpMessageConverter 的實現類,可以使用 "application/x-protobuf" 內容型別以二進位制格式讀寫 Protobuf 訊息。這需要 com.google.protobuf:protobuf-java 依賴項。

ProtobufJsonFormatHttpMessageConverter

HttpMessageConverter 的實現類,可以讀寫 Protobuf 訊息到 JSON 文件和從 JSON 文件讀寫 Protobuf 訊息。這需要 com.google.protobuf:protobuf-java-util 依賴項。