1.简述RestTemplate
是Spring用于同步client端的核心类,简化了与http服务的通信,并满足RestFul原则,程序代码可以给它提供URL,并提取结果。默认情况下,RestTemplate默认依赖jdk的HTTP连接工具。当然你也可以 通过setRequestFactory属性切换到不同的HTTP源,比如Apache HttpComponents、Netty和OkHttp。
RestTemplate能大幅简化了提交表单数据的难度,并且附带了自动转换JSON数据的功能,但只有理解了HttpEntity的组成结构(header与body),且理解了与uriVariables之间的差异,才能真正掌握其用法。这一点在Post请求更加突出,下面会介绍到。
该类的入口主要是根据HTTP的六个方法制定:
")
此外,exchange和excute可以通用上述方法。
在内部,RestTemplate默认使用HttpMessageConverter实例将HTTP消息转换成POJO或者从POJO转换成HTTP消息。默认情况下会注册主mime类型的转换器,但也可以通过setMessageConverters注册其他的转换器。
其实这点在使用的时候是察觉不到的,很多方法有一个responseType 参数,它让你传入一个响应体所映射成的对象,然后底层用HttpMessageConverter将其做映射
| 12 | HttpMessageConverterExtractor<T> responseExtractor =`` ``new HttpMessageConverterExtractor<>(responseType, getMessageConverters(), logger); |
|---|
HttpMessageConverter.java源码:
| 12345678910111213141516171819 | public 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来覆盖。