HTTP 消息转换
spring-web
模块包含 HttpMessageConverter
接口,用于通过 InputStream
和 OutputStream
读取和写入 HTTP 请求和响应的主体。HttpMessageConverter
实例在客户端(例如,在 RestClient
中)和服务器端(例如,在 Spring MVC REST 控制器中)使用。
框架中提供了主要媒体(MIME)类型的具体实现,并且默认情况下,这些实现会在客户端注册到 RestClient
和 RestTemplate
上,在服务器端注册到 RequestMappingHandlerAdapter
上(参见配置消息转换器)。
下面描述了 HttpMessageConverter
的几种实现。完整列表请参阅 HttpMessageConverter Javadoc。对于所有转换器,都会使用默认的媒体类型,但您可以通过设置 supportedMediaTypes
属性来覆盖它。
表 1. HttpMessageConverter 实现
MessageConverter | Description |
---|---|
StringHttpMessageConverter | 一种 HttpMessageConverter 实现,可以从 HTTP 请求和响应中读取和写入 String 实例。默认情况下,此转换器支持所有文本媒体类型(text/* ),并以 Content-Type 为 text/plain 进行写入。 |
FormHttpMessageConverter | 一种 HttpMessageConverter 实现,可以从 HTTP 请求和响应中读取和写入表单数据。默认情况下,此转换器读取和写入 application/x-www-form-urlencoded 媒体类型。表单数据从 MultiValueMap<String, String> 中读取并写入。转换器还可以写入(但不能读取)从 MultiValueMap<String, Object> 读取的多部分数据。默认情况下,支持 multipart/form-data 。可以支持其他多部分子类型以写入表单数据。有关详细信息,请查阅 FormHttpMessageConverter 的 javadoc。 |
ByteArrayHttpMessageConverter | 一种 HttpMessageConverter 实现,可以从 HTTP 请求和响应中读取和写入字节数组。默认情况下,此转换器支持所有媒体类型(*/* ),并以 Content-Type 为 application/octet-stream 进行写入。您可以通过设置 supportedMediaTypes 属性和重写 getContentType(byte[]) 来覆盖此行为。 |
MarshallingHttpMessageConverter | 一种 HttpMessageConverter 实现,可以通过使用 Spring 的 Marshaller 和 Unmarshaller 抽象从 org.springframework.oxm 包中读取和写入 XML。此转换器在使用前需要一个 Marshaller 和 Unmarshaller 。您可以通过构造函数或 bean 属性注入这些。默认情况下,此转换器支持 text/xml 和 application/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 。仅支持 DOMSource 、SAXSource 和 StreamSource 。默认情况下,此转换器支持 text/xml 和 application/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 依赖。 |