RestTemplate
当我们从服务消费端去调用服务提供者的服务的时候,使用了一个很好用的对象,叫做RestTemplate,当时我们只使用了RestTemplate中最简单的一个功能getForEntity发起了一个get请求去调用服务端的数据,同时,我们还通过配置@LoadBalanced注解开启客户端负载均衡,RestTemplate的功能不可谓不强大,那么今天我们就来详细的看一下RestTemplate中几种常见请求方法的使用。
RestTemplate一共有四种请求方式
- GET请求
- POST请求
- PUT请求
- DELETE请求
- GET请求
1. getForEntity()
测试方法:
@Slf4j
@RestController
public class UserController1 {
@Autowired
private RestTemplate restTemplate;
/*
* getForEntity方法的返回值是一个ResponseEntity<T>,ResponseEntity<T>是Spring对HTTP请求响应的封装,
* 包括了几个重要的元素,如响应码、contentType、contentLength、响应消息体等。
*/
@GetMapping(value = "/findOrdersByUser1/{id}")
public String findOrdersByUser(@PathVariable String id) {
log.debug(this.getClass().getName().toString());
Integer oid = 123;
// 获取getForEntity()方法的返回值
ResponseEntity<String> responseEntity = this.restTemplate
.getForEntity("http://springcloud-eureka-order/order/" + oid, String.class);
// 获取状态码信息
HttpStatus statusCode = responseEntity.getStatusCode();
// 获取状态码信息值
int statusCodeValue = responseEntity.getStatusCodeValue();
// 返回的响应体信息
HttpHeaders headers = responseEntity.getHeaders();
// 返回的响应体信息
String body = responseEntity.getBody();
StringBuffer result = new StringBuffer();
// 拼装结果集返回
result.append("responseEntity.getBody():").append(body).append("<hr>").append("responseEntity.getStatusCode():")
.append(statusCode).append("<hr>").append("responseEntity.getStatusCodeValue():")
.append(statusCodeValue).append("<hr>").append("responseEntity.getHeaders():").append(headers)
.append("<hr>");
return result.toString();
}
}
结果如下:
有时候我在调用服务提供者提供的接口时,可能需要传递参数,有其余两种不同的方式,如下:
//方法一
Integer oid = 123;
// 获取getForEntity()方法的返回值
// 可以用一个数字做占位符,最后是一个可变长度的参数,来一一替换前面的占位符
ResponseEntity<String> responseEntity = this.restTemplate
.getForEntity("http://springcloud-eureka-order/order/{1}", String.class, oid);
//方法二
Map<String, Integer> map = new HashMap<>();
map.put("oid", 123);
// 获取getForEntity()方法的返回值
// 也可以前面使用name={name}这种形式,最后一个参数是一个map,map的key即为前边占位符的名字,map的value为参数值
ResponseEntity<String> responseEntity = this.restTemplate
.getForEntity("http://springcloud-eureka-order/order/oid={oid}", String.class, map);
当然,服务提供者不仅可以返回String,也可以返回一个自定义类型的对象
首先创建common工程,打包方式为jar,创建entity包,新建Order实体类,打包到本地仓库(将order项目的实体类移动到common项目中) , 并作为jar为其他项目引入 , 同时将order项目中的util移动到common工程中
2. getForObject()函数实际上是对getForEntity函数的进一步封装,如果你只关注返回的消息体的内容,对其他信息都不关注,此时可以使用getForObject,例子如下:
其余重载方法和getForEntity()一样,就不在一一赘述了…
2. Post请求
在Rest Template中,POST请求可以通过如下三个方法来发起:
1. postForEntity()
/**
* @ClassName: UserPostController
* @Description:
* @author: 田晓斌
* @date: 2019年4月22日 下午4:27:30
*/
@Slf4j
@RestController
public class UserPostController {
@Autowired
private RestTemplate restTemplate;
@GetMapping(value = "/findOrdersByUser5/{id}")
public String findOrdersByUser(@PathVariable String id) {
log.debug(this.getClass().getName().toString());
return this.restTemplate.postForObject("http://springcloud-eureka-order/order2", id, String.class);
}
}
OrderController
/**
* 通过id查询订单
*/
@PostMapping("/order2")
public String findOrderById2(@RequestParam String id) {
Order order = new Order(id, 8.8, "小明", "北京", "13333333333");
return order.toString();
}
访问http://localhost:8001/findOrdersByUser5/5结果如下
其余重载方法和getForEntity()一样,就不在一一赘述了…
2.postForObject()
如果只关注,返回的消息体,可以直接使用postForObject。用法和getForObject一致。
3.postForLocation()
postForLocation也是提交新资源,提交成功之后,返回新资源的URI,postForLocation的参数和前面两种的参数基本一致,只不过该方法的返回值为Uri,这个只需要服务提供者返回一个Uri即可,该Uri表示新资源的位置。
- put请求
方法示例: - delete请求
方法示例:
好了 resttemplate总结一下就是get post put delete 各有三种重载方法 , 参数变化一下就好了