HTTP消息转换
spring-web 模块包含 HttpMessageConverter 接口,该接口用于通过 InputStream 和 OutputStream 读取和写入 HTTP 请求和响应的正文。HttpMessageConverter 实例既可以在客户端使用(例如,在 RestClient 中),也可以在服务器端使用(例如,在 Spring MVC REST 控制器中)。
框架中提供了主要媒体类型(MIME)的具体实现,默认情况下,这些实现会在客户端注册到RestClient和RestTemplate中,在服务器端则注册到RequestMappingHandlerAdapter中(详见配置消息转换器)。
下面描述了HttpMessageConverter的几种实现方式。如需完整列表,请参考HttpMessageConverter Javadoc。对于所有转换器,都会使用一个默认的媒体类型,但您可以通过设置supportedMediaTypes属性来覆盖它。
表1. HttpMessageConverter实现
| MessageConverter | 描述 |
|---|---|
StringHttpMessageConverter | 一个HttpMessageConverter实现,能够从HTTP请求和响应中读取和写入String实例。默认情况下,该转换器支持所有文本媒体类型(text/*),并且以text/plain的Content-Type进行写入。 |
FormHttpMessageConverter | 一个HttpMessageConverter实现,能够从HTTP请求和响应中读写表单数据。默认情况下,该转换器支持读取和写入application/x-www-form-urlencoded媒体类型。表单数据从MultiValueMap<String, String>中读取并写入其中。该转换器还可以写入(但不能读取)从MultiValueMap<String, Object>中读取的multipart数据。默认支持multipart/form-data类型;如需支持其他multipart子类型来写入表单数据,可参阅FormHttpMessageConverter的Javadoc以获取更多详细信息。 |
ByteArrayHttpMessageConverter | 一个HttpMessageConverter实现,能够从HTTP请求和响应中读取和写入字节数组。默认情况下,该转换器支持所有媒体类型(*/*),并且以application/octet-stream的Content-Type进行写入。你可以通过设置supportedMediaTypes属性并重写getContentType(byte[])方法来覆盖这一行为。 |
MarshallingHttpMessageConverter | 一个HttpMessageConverter实现,它能够利用Spring的org.springframework.oxm包中的Marshaller和Unmarshaller抽象来读写XML。在使用此转换器之前,需要准备一个Marshaller和一个Unmarshaller。你可以通过构造函数或bean属性来注入这些组件。默认情况下,该转换器支持text/xml和application/xml格式。 |
JacksonJsonHttpMessageConverter | 这是一个HttpMessageConverter实现,它能够使用Jackson的JsonMapper来读写JSON数据。你可以通过使用Jackson提供的注解来根据需要自定义JSON映射。当你需要进一步的控制(比如对于某些特定类型需要提供自定义的JSON序列化器/反序列化器时),你可以通过JsonMapper或JsonMapper.Builder的构造函数参数注入一个自定义的JsonMapper。默认情况下,这个转换器支持application/json格式。这需要依赖tools.jackson.core:jackson-databind。 |
JacksonXmlHttpMessageConverter | 一个HttpMessageConverter实现,它可以使用Jackson XML扩展的XmlMapper来读写XML。你可以通过使用JAXB或Jackson提供的注解来根据需要自定义XML映射。当你需要进一步的控制(例如在需要对特定类型提供自定义XML序列化器/反序列化器的情况下),可以通过JsonMapper或JsonMapper.Builder的构造函数参数注入一个自定义的XmlMapper。默认情况下,这个转换器支持application/xml协议。这需要依赖tools.jackson.dataformat:jackson-dataformat-xml。 |
KotlinSerializationJsonHttpMessageConverter | 一个实现了HttpMessageConverter的类,能够使用kotlinx.serialization来读写JSON数据。默认情况下,这个转换器并未被配置(因为其功能与Jackson冲突),开发者需要将其作为额外的转换器进行配置,且必须将其配置在Jackson转换器之前。 |
JacksonCborHttpMessageConverter | tools.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实现,能够以二进制格式读取和写入Protobuf消息,并使用“application/x-protobuf”内容类型。这需要依赖com.google.protobuf:protobuf-java。 |
ProtobufJsonFormatHttpMessageConverter | 一个HttpMessageConverter实现,能够将JSON文档读写为和从Protobuf消息之间转换。这需要依赖com.google.protobuf:protobuf-java-util。 |