RestTemplate实战详解
RestTemplate四种请求方式:get, post, put, delete
日常开发最常用的主要是get, post
一 常用get方式
对于get主要有两个实现,getForEntity和getForObject。
第一种 getForEntity函数
先看下api截图:
从图可以看出,getForEntity有三个重载方法,该函数返回的是ResponseEntity,
该对象是spring对HTTP请求响应的封装,其中主要存储了HTTP的几个重要元素,
比如常见的HTTP请求状态码的枚举对象HttpStatus,以及在父类HttpEntity中还存储了
HTTP请求的头信息对象HttpHeaders以及泛型类型的请求体对象。
getForEntity(String url, Class responseType, Object...urlVariables)
请求端发起请求:
/**
* getForEntity通过占位符的方式传参
*/
@RequestMapping(value = "/ribbon-consumer2", method = RequestMethod.GET)
public String helloConsumer2() {
ResponseEntity<String> responseEntity =
restTemplate.getForEntity("http://HELLO-SERVICE/hello2?name={1}", String.class, "ribbon");
String body = responseEntity.getBody();
return body;
}
接收端处理请求:
@RequestMapping(value = "/hello2", method = RequestMethod.GET)
public String hello2(String name) {
return "Hello World " + name;
}
在请求端参数ribbon会替换掉url中的{1}占位符,从而返回ResponseEntity对象,
而对象中的body内容类型会根据第二个参数String.class转换为String类型。
然后getBody获取的就是接受端处理后返回的Hello World ribbon字符串。
如果我们希望返回的body是一个对象,我们可以将返回类型设置为对象。
ResponseEntity<User> responseEntity =
restTemplate.getForEntity("http://HELLO-SERVICE/hello2?name={1}", User.class, "ribbon");
User user = responseEntity.getBody();
getForEntity(String url, Class responseType, Map urlVariables)
参数类型使用Map的方式传递。
请求端发送请求 :
/**
* getForEntity通过Map方式传参
* map中put的key与url中的{name}保持一致性
*/
@RequestMapping(value = "/ribbon-consumer3", method = RequestMethod.GET)
public String helloConsumer3() {
Map<String,String> paramsMap = new HashMap<String,String>();
paramsMap.put("name", "ribbon");
ResponseEntity<String> responseEntity =
restTemplate.getForEntity("http://HELLO-SERVICE/hello3?name={name}", String.class, paramsMap);
String body = responseEntity.getBody();
return body;
}
接收端接收请求:
@RequestMapping(value = "/hello3", method = RequestMethod.GET)
public String hello3(String name) {
return "Hello World " + name;
}
相对于第一种url占位符的方式,参数被封装在Map中,使用该方式进行参数绑定时
需要在占位符中指定Map中参数的Key值,比如占位符中的key为name,
参数Map中就需要put一个key为name的参数来绑定url中的{name}占位符的值。
这种方式,就是将参数抽象到map中,而接收端并没有变化,如果修改参数值,
直接修改map中key对应的value即可,不需要在维护url中的参数值。
用起来很别扭,如果需要传递一个map,一般使用post请求会方便很多。
getForEntity(URI url, Class responseType)
对于第三个重载方法,一般很少用。
第二种 getForObject函数
关于get还有另外一种函数,getForObject函数。该函数可以理解为getForEntity的进一步封装,
它通过HttpMessageConverterExtractor的HTTP的请求响应体body内容进行对象转换,
实现请求返回包装好的对象内容。咱们看看有哪些重载方法:
看上去与getForEntity很类似,只是返回值不同了,直接给返回了一个对象,
不需要像getForEntity一样需要getBody()获取对象,getForObject已经封装好对象。
用法与getForEntity类似。
2. 常用post方式
post请求有三种,postForEntity函数、postForObject函数和postForLocation函数。
第一种 postForEntity函数
该方法与get请求中的getForEntity类似,调用后同样返回一个
ResponseEntity<T>对象,其中T为请求响应的body类型。比如:
请求端发送请求:
@RequestMapping(value = "/ribbon-consumer5", method = RequestMethod.GET)
public String helloConsumer5() {
UserMain userMain = new UserMain();
userMain.setUsername("ribbon");
userMain.setPassword("123456");
ResponseEntity<String> responseEntity =
restTemplate.postForEntity("http://HELLO-SERVICE/hello5", userMain, String.class);
String body = responseEntity.getBody();
return body;
}
接收端接收请求:
@RequestMapping(value = "/hello5", method = RequestMethod.POST)
public String hello5(@RequestBody UserMain userMain) {
return "Hello World " + " username=" + userMain.getUsername()
+ " password=" + userMain.getPassword();
}
请求端通过getBody获取响应字符串: Hello World username=ribbon password=123456
使用post请求HELLO-SERVICE服务的hello5接口,提交的body内容为UserMain对象,
请求响应返回的body类型为String。postForEntity同样也有三个重载方法:
与getForEntity不同的是,新增加了第二个参数request,
request参数可以是一个普通对象,也可以是一个HttpEntity对象。
如果是一个普通对象,RestTemplate会将请求对象转换为一个HttpEntity对象来处理,
Object就是request类型,request内容会被当作一个完成的body来处理;
如果request是一个HttpEntity对象,会被当作一个完成的HTTP请求对象处理,
这个对象就包含body和header内容。
第二种 postForObject函数
与getForObject类似,是对postForEntity曹操的简化。同样有三个重载函数:
来一个实例看看,请求端发送请求:
@RequestMapping(value = "/ribbon-consumer4", method = RequestMethod.POST)
public String helloConsumer4() {
Map<String,String> paramsMap = new HashMap<String,String>();
paramsMap.put("name", "ribbon");
String body = restTemplate.postForObject("http://HELLO-SERVICE/hello4", paramsMap, String.class);
return body;
}
接收端接收请求:
@RequestMapping(value = "/hello4", method = RequestMethod.POST)
public String hello4(@RequestBody Map<String,String> map) {
return "Hello World " + map.get("name");
}
请求端封装map参数,接收端接收到map后直接处理,返回响应结果 Hello World ribbon。
封装map可以,传一个实体对象也是一样的,类似postForEntity中传递或接受方式。
第三种 getForLocation函数
一般不常用,也有三个重载:
返回值比较特殊,URI,这些方法主要实现以POST请求提交资源,
并返回新的资源URI,相当于指定了返回值类型,所以就不需要显示的指定responseType。
总结: 每一种访问方式写一个实例访问分析,可以更好的体会访问的各种有缺点。
上一篇: 记录一次性能优化的过程
下一篇: 记一次 ListView 性能优化过程