Springboot - 更优雅的方式请求发 HTTP 请求

参考: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;
}
posted @ 2019-11-16 10:55  byebai95  阅读(1593)  评论(0编辑  收藏  举报