简述RestTemplate

79 阅读2分钟

1.简述RestTemplate

是Spring用于同步client端的核心类,简化了与http服务的通信,并满足RestFul原则,程序代码可以给它提供URL,并提取结果。默认情况下,RestTemplate默认依赖jdk的HTTP连接工具。当然你也可以 通过setRequestFactory属性切换到不同的HTTP源,比如Apache HttpComponents、Netty和OkHttp。

RestTemplate能大幅简化了提交表单数据的难度,并且附带了自动转换JSON数据的功能,但只有理解了HttpEntity的组成结构(header与body),且理解了与uriVariables之间的差异,才能真正掌握其用法。这一点在Post请求更加突出,下面会介绍到。

该类的入口主要是根据HTTP的六个方法制定:

![Springboot -- 用更优雅的方式发HTTP请求(RestTemplate详解)]( "Springboot -- 用更优雅的方式发HTTP请求(RestTemplate详解)")

此外,exchange和excute可以通用上述方法。

在内部,RestTemplate默认使用HttpMessageConverter实例将HTTP消息转换成POJO或者从POJO转换成HTTP消息。默认情况下会注册主mime类型的转换器,但也可以通过setMessageConverters注册其他的转换器。

其实这点在使用的时候是察觉不到的,很多方法有一个responseType 参数,它让你传入一个响应体所映射成的对象,然后底层用HttpMessageConverter将其做映射

12HttpMessageConverterExtractor<T> responseExtractor =``                ``new HttpMessageConverterExtractor<>(responseType, getMessageConverters(), logger);

 

HttpMessageConverter.java源码:

12345678910111213141516171819public interface HttpMessageConverter<T> {``        ``//指示此转换器是否可以读取给定的类。``    ``boolean canRead(Class<?> clazz, ``@Nullable MediaType mediaType);         ``//指示此转换器是否可以写给定的类。``    ``boolean canWrite(Class<?> clazz, ``@Nullable MediaType mediaType);         ``//返回List<MediaType>``    ``List<MediaType> getSupportedMediaTypes();         ``//读取一个inputMessage``    ``T read(Class<? ``extends T> clazz, HttpInputMessage inputMessage)``            ``throws IOException, HttpMessageNotReadableException;         ``//往output message写一个Object``    ``void write(T t, ``@Nullable MediaType contentType, HttpOutputMessage outputMessage)``            ``throws IOException, HttpMessageNotWritableException; }

  

在内部,RestTemplate默认使用SimpleClientHttpRequestFactory和DefaultResponseErrorHandler来分别处理HTTP的创建和错误,但也可以通过setRequestFactory和setErrorHandler来覆盖。