参考: https://www.cnblogs.com/javazhiyin/p/9851775.html
RestTemplate
是 Spring 提供的用于访问 REST 服务的客户端 RestTemplate 提供了多种便捷访问 HttP 服务的方法, 能够大大提示客户端的编写效率
我们之前的 Http 开发是用 apache 的 HttpClient 开发, 代码复杂. 以下是封装好的一个 get 请求
- public static JSONObject doGet(String url) {
- JSONObject jsonResult = null;
- try (CloseableHttpClient client = HttpClients.createDefault();) {
- HttpGet request = new HttpGet(url);
- request.setConfig(requestConfig);
- try (CloseableHttpResponse response = client.execute(request);) {
- int statusCode = response.getStatusLine().getStatusCode();
- if (statusCode == HttpStatus.SC_OK) {
- HttpEntity entity = response.getEntity();
- String responseContent = EntityUtils.toString(entity);
- jsonResult = JSONObject.parseObject(responseContent);
- } else {
- log.error("Get 请求失败:{} , 状态码:{}", url, statusCode);
- }
- }
- } catch (IOException e) {
- log.error("Get 请求异常:{} , {}", url, e.getMessage());
- e.printStackTrace();
- }
- return jsonResult;
- }
本教程将实现 spring 生态内 RestTemplate 的 get 请求和 post 请求 还有 exchange 指定请求类型 和 RestTemplate 核心源码的分析.
一, 简书 RestTemplate
是 Spring 用于同步 client 端的核心类, 简化了与 http 服务的通信, 并满足 RestFul 原则, 程序代码可以给它提供 URL, 并提取结果. 默认情况下, RestTemplate 默认依赖 jdk 的 HTTP 连接工具.
当然你也可以 通过 setRequestFactory 属性切换到不同的 HTTP 源, 比如 Apache HttpComponents,Netty 和 OkHttp.
RestTemplate 能大幅简化了提交表单数据的难度, 并且附带自动转换 JSON 数据的功能, 但只有理解了 HttpEntity 的组成结构 (header,body), 且理解了与 urlVariables 之间的差异, 才能正则掌握其用法.
该类的入口主要是根据 HTTP 的六个方法制定
此外, exchange 和 excute 可以通用上述方法.
在内部 RestTemplate 默认使用 HttpMessageConverter 实例将 HTTP 消息转换成 POJO 或者从 POJO 转换成 HTTP 消息. 默认情况下会注册到 mime 类型的转换器, 但也可以通过 setMessageConverters 注册其他转换器.
其实这点在使用的时候是察觉不到的, 很多方法有一个 responseType 参数, 它让你传入一个响应体所映射成的对象, 然后底层用 HttpMessageConverter 将其做映射
- HttpMessageConverterExtractor<T> responseExtractor =
- new HttpMessageConverterExtractor<>(responseType, getMessageConverters(), logger);
HttpMessageConverter.java
- 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 和 DefaultResponseErrorHeader 来处理 Http 的创建和错误, 但也可以通过 setRequestFactory 和 setErrorHander 来覆盖
二, get 请求实践
- public <T> T getForObject(String url, Class<T> responseType, Object... uriVariables){
- }
- public <T> T getForObject(String url, Class<T> responseType, Map<String, ?> uriVariables)
- public <T> T getForObject(URI url, Class<T> responseType)
getForObject() 其实比 getFacEntity() 多包含了将 Http 转成 POJO 的功能, 但是没有处理 response 的能力. 应为它拿到收的就是 POJO
- POJO
- public class Notice {
- private int status;
- private Object msg;
- private List<DataBean> data;
- }
- public class DataBean {
- private int noticeId;
- private String noticeTitle;
- private Object noticeImg;
- private long noticeCreateTime;
- private long noticeUpdateTime;
- private String noticeContent;
- }
来源: http://www.bubuko.com/infodetail-3289924.html