1. 簡單介紹
RestTemplate
是 Spring 框架
中的一個工具類,它能讓傳送 HTTP 訊息和處理響應變得簡單。RestTemplate
類提供了許多功能,非常適合編寫簡單的 HTTP 客戶端:
- 支援所有標準 HTTP 方法(GET、POST 等)。
- 能夠處理所有標準 MIME Type(JSON、XML、表單等)。
- 高階 API 允許我們使用 Java 程式碼進行配置,並避免複雜的序列化問題。
- 可使用
ClientHttpRequestInitializer
和ClientHttpRequestInterceptor
介面進行自定義。
從 Spring Framework 5 開始,除了 WebFlux,Spring 還引入了一個名為 WebClient
的新 HTTP 客戶端。 WebClient
是一種替代 RestTemplate
的現代 HTTP 客戶端。它不僅提供傳統的同步 API,還支援高效的非阻塞和非同步方法。
2. GET方法
getForEntity
相比較於getForObject
可以訪問完整的 HTTP 響應。一般情況下我們使用getForObject
即可。
@GetMapping("/{id}")
@Operation(summary = "根據ID查詢訂單資訊")
public ResponseResult getOrderById(@PathVariable Integer id){
return restTemplate.getForObject(PRE_SERVER + "/pay/" + id, ResponseResult.class, id);
}
第一個引數為要訪問的URL,第二個引數為返回值的型別,第三個路徑引數值
3. POST方法
@Operation(summary = "新增支付訂單資訊")
@PostMapping
public ResponseResult saveOrder(@RequestBody PayDTO payDTO){
return restTemplate.postForObject(PRE_SERVER+"/pay",payDTO,ResponseResult.class);
}
第二個引數是我們透過Http訪問方法的引數,第三個是返回值型別
4.PUT方法
@PutMapping
@Operation(summary = "更新訂單資訊")
public ResponseResult updateOrderById(@RequestBody PayDTO payDTO){
restTemplate.put(PRE_SERVER + "/pay", payDTO);
return ResponseResult.success();
}
第二個引數是我們要更新的資料
5.DELETE方法
@DeleteMapping("/{id}")
@Operation(summary = "刪除訂單資訊")
public ResponseResult deleteOrderById(@PathVariable Integer id){
restTemplate.delete(PRE_SERVER+"/pay/" +id);
return ResponseResult.success();
}
路徑變數也可以作為方法的第二個引數。
6.完整程式碼
@RestController
@RequestMapping("/consumer/pay")
@Tag(name = "訂單模組", description = "訂單相關介面")
public class ConsumerController {
@Resource
private RestTemplate restTemplate;
private static final String PRE_SERVER = "http://localhost:8001";
@Operation(summary = "新增支付訂單資訊")
@PostMapping
public ResponseResult saveOrder(@RequestBody PayDTO payDTO){
return restTemplate.postForObject(PRE_SERVER+"/pay",payDTO,ResponseResult.class);
}
@GetMapping("/{id}")
@Operation(summary = "根據ID查詢訂單資訊")
public ResponseResult getOrderById(@PathVariable Integer id){
return restTemplate.getForObject(PRE_SERVER + "/pay/" + id, ResponseResult.class, id);
}
@DeleteMapping("/{id}")
@Operation(summary = "刪除訂單資訊")
public ResponseResult deleteOrderById(@PathVariable Integer id){
restTemplate.delete(PRE_SERVER+"/pay/" +id);
return ResponseResult.success();
}
@PutMapping
@Operation(summary = "更新訂單資訊")
public ResponseResult updateOrderById(@RequestBody PayDTO payDTO){
restTemplate.put(PRE_SERVER + "/pay", payDTO);
return ResponseResult.success();
}
}
需要增加配置類:
@Configuration
public class RestConfig {
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}