zoukankan      html  css  js  c++  java
  • Springboot

    参考: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;
    }
  • 相关阅读:
    linux里忘记root密码解决办法
    Oracle怎样方便地查看报警日志错误
    清空文件内容
    channel c3 disabled, job failed on it will be run on another channel
    未能启动虚拟电脑,由于下述物理网卡找不到,你可修改虚拟电脑的网络设置或停用之
    DG下手工处理v$archive_gap方法
    Vue.js + Element.ui 从搭建环境到打包部署
    js判断json对象是否为空
    获取 request 中用POST方式"Content-type"是"application/x-www-form-urlencoded;charset=utf-8"发送的 json 数据
    DIV的内容自动换行
  • 原文地址:https://www.cnblogs.com/bytecodebuffer/p/11870982.html
Copyright © 2011-2022 走看看