HTTP 消息转换

spring-web 模块包含 HttpMessageConverter 接口,用于通过 InputStreamOutputStream 读取和写入 HTTP 请求和响应的正文。 HttpMessageConverter 实例在客户端(例如,在 RestClient 中)和服务器端(例如,在 Spring MVC REST 控制器中)使用。

框架中提供了主要媒体(MIME)类型的具体实现,并且默认情况下,它们在客户端注册到 RestClientRestTemplate,在服务器端注册到 RequestMappingHandlerAdapter(请参阅 配置消息转换器)。

下面描述了几种 HttpMessageConverter 的实现。 有关完整列表,请参阅 HttpMessageConverter Javadoc。 对于所有转换器,都使用默认媒体类型,但可以通过设置 supportedMediaTypes 属性来覆盖它。

Table 1. HttpMessageConverter 实现
MessageConverter 描述

StringHttpMessageConverter

一个 HttpMessageConverter 实现,可以从 HTTP 请求和响应中读取和写入 String 实例。 默认情况下,此转换器支持所有文本媒体类型 (text/*),并以 text/plainContent-Type 写入。

FormHttpMessageConverter

一个 HttpMessageConverter 实现,可以从 HTTP 请求和响应中读取和写入表单数据。 默认情况下,此转换器读取和写入 application/x-www-form-urlencoded 媒体类型。 表单数据被读取到 MultiValueMap<String, String> 中并从其中写入。 该转换器还可以写入(但不能读取)从 MultiValueMap<String, Object> 读取的多部分数据。 默认情况下,支持 multipart/form-data。 可以支持额外的多部分子类型以写入表单数据。 有关更多详细信息,请查阅 FormHttpMessageConverter 的 javadoc。

ByteArrayHttpMessageConverter

一个 HttpMessageConverter 实现,可以从 HTTP 请求和响应中读取和写入字节数组。 默认情况下,此转换器支持所有媒体类型 (/),并以 application/octet-streamContent-Type 写入。 您可以通过设置 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 依赖项。

KotlinSerializationJsonHttpMessageConverter

一个 HttpMessageConverter 实现,可以使用 kotlinx.serialization 来读取和写入 JSON。 此转换器默认未配置,因为它与 Jackson 冲突。 开发人员必须将其配置为 Jackson 之前的一个额外转换器。

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 实现,可以以二进制格式读取和写入 Protobuf 消息,内容类型为 "application/x-protobuf"。 这需要 com.google.protobuf:protobuf-java 依赖项。

ProtobufJsonFormatHttpMessageConverter

一个 HttpMessageConverter 实现,可以读取和写入 JSON 文档与 Protobuf 消息之间的转换。 这需要 com.google.protobuf:protobuf-java-util 依赖项。