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 各有三種重載方法 , 參數變化一下就好了