HTTP 消息转换

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

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

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

Table 1. HttpMessageConverter 实现
消息转换器 描述

StringHttpMessageConverter

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

FormHttpMessageConverter

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

ByteArrayHttpMessageConverter

一个 HttpMessageConverter 实现,可以从 HTTP 请求和响应中读取和写入字节数组。 默认情况下,此转换器支持所有媒体类型(/),并以 Content-Typeapplication/octet-stream 进行写入。 您可以通过设置 supportedMediaTypes 属性并覆盖 getContentType(byte[]) 来覆盖此设置。

MarshallingHttpMessageConverter

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

ProtobufJsonFormatHttpMessageConverter

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