HTTP 消息转换

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

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

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

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

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的MarshallerUnmarshaller抽象(来自org.springframework.oxm包)来读取和写入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实现,可以将JSON文档读取和写入Protobuf消息。这需要com.google.protobuf:protobuf-java-util依赖项。