Spring之HTTP Message Conversion(HTTP消息转换)

传递给这些方法和从这些方法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可能是一个好的选择。






  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值