最近在看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 }
也可能这样写更麻烦的写法:
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 }
但是我们使用resttemplete的时候可以这样写:
1 RestTemplate restTemplate=new RestTemplate();
2 dto=restTemplate.getForObject("url",dto.class);
在使用中可能返回list,可以这样写:
1 Person [] personArry=new RestTemplete().getForObject("www.test.com",Person [].class);
2 List<Person > persons=Arrays.asList(personArry);
两行代码,对的,没看错,就是这么简洁。喜好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的初衷吗。代码的简洁也会让人心情舒畅。