跳到主要内容

HTTP 消息转换

ChatGPT-4o 中英对照 HTTP Message Conversion

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

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

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

表 1. HttpMessageConverter 实现

MessageConverterDescription
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 实现,可以通过使用 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 依赖。
MappingJackson2CborHttpMessageConvertercom.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 文档。这需要 com.google.protobuf:protobuf-java-util 依赖。