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中看:

 post提交json数据写法

RestTemplate resetTemplate = new RestTemplate();
        Map<String, Object> requestMap = new HashMap<String, Object>();
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);
        HttpEntity<Map<String, Object>> requestEntity = new HttpEntity<Map<String, Object>>(requestMap, headers);
        String responseAsString = resetTemplate.postForObject("", requestEntity, String.class);
        JSONObject jsonObject = JSON.parseObject(responseAsString);

 

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

 

posted @ 2019-08-01 15:54  Rolay  阅读(790)  评论(0编辑  收藏  举报