最近在看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
两行代码,对的,没看错,就是这么简洁。喜好java 8 lambda 那种简洁的写法,爱用Bean copy这种写法的我看到就爱上了。然后具体里面的实现是什么样的呢,随便点一个方法进去看到实现:
其实所有的都调用了execute这个方法,然后再进入execute中看:
execute中又调用了doExecute,进入doExecute中看:
其实可以看到关于请求的实现都在这个方法里面了,其实看起来就像是spring帮助我们封装了请求而已,让我们调用更加简洁,这不正是spring的初衷吗。代码的简洁也会让人心情舒畅。