HTTP Message Conversion

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

框架中提供了主媒体(MIME)类型的具体实现,默认情况下,它们在客户端与`RestClient`和`RestTemplate`注册,在服务器端与`RequestMappingHandlerAdapter`注册(请参阅Configuring Message Converters)。

下面描述了`HttpMessageConverter`的一些实现。有关完整列表,请参阅https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/http/converter/HttpMessageConverter.html[HttpMessageConverter`Javadoc]。所有转换器都使用默认媒体类型,但可以通过设置`supportedMediaTypes 属性来覆盖它。

Table 1. HttpMessageConverter Implementations
MessageConverter Description

StringHttpMessageConverter

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

FormHttpMessageConverter

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

ByteArrayHttpMessageConverter

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

MarshallingHttpMessageConverter

一个实现,可以使用 Spring 的 MarshallerUnmarshallerorg.springframework.oxm 包中抽象读取和写入 XML。此转换器要求一个 MarshallerUnmarshaller,然后才能使用此转换器。您可以通过构造函数或 bean 属性注入这些属性。默认情况下,此转换器支持 text/xmlapplication/xml

MappingJackson2HttpMessageConverter

一个实现,可以使用 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

一个实现,可以从 HTTP 请求和响应中读取和写入 javax.xml.transform.Source。仅支持 DOMSourceSAXSourceStreamSource。默认情况下,此转换器支持 text/xmlapplication/xml

GsonHttpMessageConverter

一个实现,可以使用“Google Gson”读取和写入 JSON。这需要 com.google.code.gson:gson 依赖项。

JsonbHttpMessageConverter

一个实现,可以使用 Jakarta Json Bind API 读取和写入 JSON。这需要 jakarta.json.bind:jakarta.json.bind-api 依赖项和一个可用的实现。

ProtobufHttpMessageConverter

一个实现,可以使用 "application/x-protobuf" 内容类型以二进制格式读取和写入 Protobuf 消息。这需要 com.google.protobuf:protobuf-java 依赖项。

ProtobufJsonFormatHttpMessageConverter

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