zoukankan      html  css  js  c++  java
  • spring 中的RestTemplete

    最近在看spring cloud相关的书籍,在看到foreign的时候,看到了其内部是使用resttemplete实现的。于是对这个东西很好奇。去看了下里面的实现,就像发现了新大陆一般啊,原来还有这个玩意儿,还有这种神仙写法,为什么之前没有发现。

    在之前我们要发起一个http请求,可能这样写:

     1 String url="www.test.com/getdata";
     2         OkHttpClient okHttpClient = new OkHttpClient();
     3         // 设置媒体类型。application/json表示传递的是一个json格式的对象
     4         MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded");
     5         // 创建RequestBody对象,将参数按照指定的MediaType封装
     6         Request request = new Request.Builder().get().url(url).build();
     7         try {
     8             Response response = okHttpClient.newCall(request).execute();
     9             String result = response.body().string();
    10         } catch (IOException e) {
    11             e.printStackTrace();
    12         }
    OkHttpClient

    也可能这样写更麻烦的写法:

     1 PrintWriter out = null;
     2   BufferedReader in = null;
     3   String result = "";
     4   try {
     5     URL realUrl = new URL("www.test.com/getdata");
     6     // 打开和URL之间的连接
     7     URLConnection conn = realUrl.openConnection();
     8     // 设置通用的请求属性
     9     conn.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
    10 
    11               //设置接受的文件类型,*表示一切可以接受的
    12 
    13     conn.setRequestProperty("accept", "*/*");
    14     conn.setRequestProperty("connection", "Keep-Alive");
    15     //TODO 新添加的请求头编码
    16     conn.setRequestProperty("Accept-Charset", "UTF-8");
    17     conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
    18     // 发送POST请求必须设置如下两行
    19     conn.setDoOutput(true);
    20     conn.setDoInput(true);
    21     // 获取URLConnection对象对应的输出流
    22     out = new PrintWriter(conn.getOutputStream());
    23     // 发送请求参数
    24     out.print(param);
    25     // flush输出流的缓冲
    26     out.flush();
    27     // 定义BufferedReader输入流来读取URL的响应
    28     /*in = new BufferedReader(
    29       new InputStreamReader(conn.getInputStream()));*/
    30     //TODO 新添加设置,返回编码
    31     in = new BufferedReader(
    32       new InputStreamReader(conn.getInputStream(), "utf-8"));
    33     String line;
    34     while ((line = in.readLine()) != null) {
    35       result += line;
    36     }
    37   } catch (Exception e) {
    38     System.out.println("发送 POST 请求出现异常!" + e.toString());
    39     e.printStackTrace();
    40   }
    41   // 使用finally块来关闭输出流、输入流
    42   finally {
    43     try {
    44       if (out != null) {
    45         out.close();
    46       }
    47       if (in != null) {
    48         in.close();
    49       }
    50     } catch (IOException ex) {
    51       System.out.println("发送 POST 请求出现异常!" + ex.toString());
    52       ex.printStackTrace();
    53     }
    54   }
    URLConnection

    但是我们使用resttemplete的时候可以这样写:

    1  RestTemplate restTemplate=new RestTemplate();
    2    dto=restTemplate.getForObject("url",dto.class);
    RestTemplete

    在使用中可能返回list,可以这样写:

    1 Person []  personArry=new RestTemplete().getForObject("www.test.com",Person [].class);
    2 List<Person > persons=Arrays.asList(personArry);
    返回list

    两行代码,对的,没看错,就是这么简洁。喜好java 8 lambda 那种简洁的写法,爱用Bean copy这种写法的我看到就爱上了。然后具体里面的实现是什么样的呢,随便点一个方法进去看到实现:

    其实所有的都调用了execute这个方法,然后再进入execute中看:

    execute中又调用了doExecute,进入doExecute中看:

    其实可以看到关于请求的实现都在这个方法里面了,其实看起来就像是spring帮助我们封装了请求而已,让我们调用更加简洁,这不正是spring的初衷吗。代码的简洁也会让人心情舒畅。

  • 相关阅读:
    用SQL语句实现:当A列大于B列时选择A列否则选择B列,当B列大于C列时选择B列否则选择C列。
    用一条SQL语句显示所有可能的比赛组合
    查询表A中存在ID重复三次以上的记录
    统计numpy数组中最频繁出现的值
    有两个表A和B,均有key和value两个字段,如果B的key在A中也有,就把B的value替换为A中对应的value
    距离和相似度
    NumPy 中的集合运算
    模式识别、机器学习傻傻分不清?给我三分钟!
    NTP服务器方案介绍
    NTP网络时钟原理及应用
  • 原文地址:https://www.cnblogs.com/rolayblog/p/11283127.html
Copyright © 2011-2022 走看看