传递给这些方法和从这些方法getForObject(), postForLocation()
, 和 put()
返回的对象被HttpMessageConverters转换为HTTP请求和从HTTP响应中返回。HttpMessageConverter接口如下:
public interface HttpMessageConverter<T> {
// Indicate whether the given class and media type can be read by this converter.
boolean canRead(Class<?> clazz, MediaType mediaType);
// Indicate whether the given class and media type can be written by this converter.
boolean canWrite(Class<?> clazz, MediaType mediaType);
// Return the list of MediaType objects supported by this converter.
List<MediaType> getSupportedMediaTypes();
// Read an object of the given type from the given input message, and returns it.
T read(Class<T> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException;
// Write an given object to the given output message.
void write(T t, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException;
}
框架提供了主要media类型的具体实现,并使用客户端的RestTemplate默认注册,在服务器端使用AnnotationMethodHandlerAdapter。
StringHttpMessageConverter
StringHttpMessageConverter实现类可以从HTTP请求和响应中读写String类型。默认地,这个转换器支持所有的文本media类型(text/*),并使用text/plain的Content-Type来写。
FormHttpMessageConverter
FormHttpMessageConverter实现类可以读写HTTP请求和响应中任何格式的数据。默认地,这个转换器读写的media类型是application/x-www-form-urlencoded。格式化数据的读写都在MultiValueMap<String, String>的集合中。
ByteArrayHttpMessageConverter
一个HttpMessageConverter的实现可以从HTTP请求和响应中读写字节数组。默认地,这个转换器支持所有默认的media类型(*/*)并使用application/octet-stream的Content-Type写。这个可以通过设置supportedMediaTypes属性重写,并可重写getContentType(byte[])。
MarshallingHttpMessageConverter
HttpMessageConverter的实现类可以使用org.springframework.oxm包中的Marshaller和Unmarshaller抽象类读写XML。这个转换器在使用前需要一个Marshaller和Unmarshaller。这些可以同过构造器或bean属性注入。默认地这个构造器支持( text/xml
)和 ( application/xml
)。
MappingJackson2HttpMessageConverter (or MappingJacksonHttpMessageConverter with Jackson 1.x)
HttpMessageConverter实现类可以使用Jackson’s ObjectMapper读写JSON。JSON映射可以通过Jackson提供的注解按需定制化。当需要将来的控制时,一个通用的ObjectMapper可以通过ObjectMapper属性注入,这发生在通用的JSON序列化或反序列化需要提供给指定类型的时候。默认地这个转换器支持(application/json).
SourceHttpMessageConverter
HttpMessageConverter实现类可以读写来自HTTP请求和响应的javax.xml.transform.Source。只支持DOMSource,SAXSource和StreamSource。默认地,这个转换器支持 (
text/xml
) 和 ( application/xml
)。
BufferedImageHttpMessageConverter
HttpMessageConverter实现类可以读写HTTP请求和响应的java.awt.image.BufferedImage。这个转换器读写由Java I/O API支持的media类型。
21.10.3 异步RestTemplate
那些日期web应用程序经常需要查询外部的REST业务。当浏览应用程序时,HTTP和异步调用很自然的会引起一些需要解决的东西:多线程可能会阻塞,等待远程HTTP响应。
AsyncRestTemplate的API与之前的RestTemplate非常相似。主要的区别是AsyncRestTemplate将具体结果封装在ListenableFuture中。
前面的例子RestTemplate转为如下:
// async call
Future<ResponseEntity<String>> futureEntity = template.getForEntity(
"http://example.com/hotels/{hotel}/bookings/{booking}", String.class, "42", "21");
// get the concrete result - synchronous call
ResponseEntity<String> entity = futureEntity.get();
ListenableFuture接受完全调用:
ListenableFuture<ResponseEntity<String>> futureEntity = template.getForEntity(
"http://example.com/hotels/{hotel}/bookings/{booking}", String.class, "42", "21");
// register a callback
futureEntity.addCallback(new ListenableFutureCallback<ResponseEntity<String>>() {
@Override
public void onSuccess(ResponseEntity<String> entity) {
//...
}
@Override
public void onFailure(Throwable t) {
//...
}
});
注意: 默认的AsyncRestTemplate构造器注册了一个SimpleAsyncTaskExecutor
,来执行HTTP请求。当处理大量短期请求时,线程池实现TaskExecutor 像ThreadPoolTaskExecutor可能是一个好的选择。