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 依赖项。