- Spring Boot進階:原理、實戰與面試題分析
- 鄭天民
- 1368字
- 2022-07-05 09:41:52
4.1.2 消費Web服務
當我們創建Controller之后,接下來要做的事情就是對它暴露的HTTP端點進行消費。這就是本小節要介紹的內容,我們將引入Spring Boot提供的RestTemplate模板工具類。
1. 創建RestTemplate
要想創建一個RestTemplate對象,最簡單也最常見的方法就是直接new一個該類的實例,如代碼清單4-6所示。
代碼清單4-6 創建RestTemplate實例示例
@Bean public RestTemplate restTemplate(){ return new RestTemplate(); }
這里創建了一個RestTemplate實例,并通過@Bean注解將其注入到Spring容器中。在Spring Boot應用程序中,通常我們會把上述代碼放在Bootstrap類中,這樣在代碼工程的其他地方都可以引用這個實例。
2. 使用RestTemplate
我們明確,通過RestTemplate發送的請求和獲取的響應都是以JSON作為序列化方式。當創建完RestTemplate之后,我們就可以使用它內置的工具方法來向遠程Web服務發起請求。RestTemplate為開發人員提供了一大批發送HTTP請求的工具方法,如表4-1所示。
表4-1 RestTemplate發送HTTP請求方法列表

在一個Web請求中,請求路徑可以攜帶參數,在使用RestTemplate時也可以在它的URL中嵌入路徑變量。例如,針對前面介紹的UserController中的HTTP端點,我們可以發起如代碼清單4-7所示的Web請求。
代碼清單4-7 URL中帶1個參數的Web請求示例
("http://localhost:8080/users/{id}", 100)
這里我們定義了一個擁有路徑變量名為id的URL,然后在實際訪問時將該變量值設置為100。
URL中也可以包含多個路徑變量,因為Java支持不定長參數語法,所以多個路徑變量的賦值將按參數依次設置。在代碼清單4-8所示的代碼中,我們就在URL中定義了username和password這兩個路徑變量,實際訪問時它們將被替換為tianyalan和123456。
代碼清單4-8 URL中帶2個參數的Web請求示例
("http://localhost:8080/users/{username}/{password}", "tianyalan", 123456)
一旦準備好了請求URL,就可以使用RestTemplate所提供的一系列工具方法完成遠程服務的訪問。
我們先來介紹get方法組,包括getForObject()和getForEntity()這兩組方法,每組各有參數完全對應的三個方法。例如,getForObject()方法組中的三個方法如代碼清單4-9所示。從方法定義上不難看出它們之間的區別只是在對所傳入參數的處理上有所不同。
代碼清單4-9 getForObject()方法組代碼
public <T> T getForObject(URI url, Class<T> responseType) public <T> T getForObject(String url, Class<T> responseType, Object... uriVariables) public <T> T getForObject(String url, Class<T> responseType, Map<String, ?> uriVariables)
對于UserController暴露的HTTP端點,我們就可以通過getForObject()方法構建一個HTTP請求來獲取目標User對象,實現代碼如代碼清單4-10所示。
代碼清單4-10 getForObject()方法調用的示例代碼
User result = restTemplate.getForObject("http://localhost:8080/users/{id}", User.class, 100);
可以使用getForEntity()方法實現同樣的效果,但寫法上有所區別,如代碼清單4-11所示。
代碼清單4-11 getForEntity()方法調用的示例代碼
ResponseEntity<User> result = restTemplate.getForEntity("http://localhost:8080/users/{id}", User.class, 100); User user = result.getBody();
可以看到,getForEntity()方法的返回值是一個ResponseEntity對象,在這個對象中還包含了HTTP消息頭等信息。而getForObject()方法返回的只是業務對象本身。這是兩個方法組的主要區別,我們可以根據需要對其進行選擇。
針對UserController中用于創建用戶信息的HTTP端點來說,通過postForEntity()方法發送POST請求的示例代碼如代碼清單4-12所示。
代碼清單4-12 postForEntity()方法調用的示例代碼
User user = new User(); user.setName("tianyalan"); user.setPassword("123456"); ResponseEntity<User> responseEntity = restTemplate.postForEntity("http://localhost:8080/users", user, User.class); return responseEntity.getBody();
可以看到,這里通過postForEntity()方法傳遞一個User對象到UserController所暴露的端點,并獲取了該端點的返回值。postForObject()的操作方式也與此類似。
在掌握了get方法組和post方法組之后,理解put方法組和delete方法組就顯得非常容易了。其中,put方法組與post方法組相比只是在操作語義上有差別,而delete方法組的使用過程也和get方法組類似,這里就不再展開講解。
最后,我們還有必要介紹一下exchange方法組。對于RestTemplate而言,exchange()是一個通用且統一的方法,它既能發送GET和POST請求,也能用于其他各種類型的請求。我們來看一下exchange方法組中的一個exchange()方法簽名,如代碼清單4-13所示。
代碼清單4-13 exchange ()方法的定義
public <T> ResponseEntity<T> exchange(String url, HttpMethod method, @Nullable HttpEntity<?> requestEntity, Class<T> responseType, Object... uriVariables) throws RestClientException
請注意,這里的requestEntity變量是一個HttpEntity對象,封裝了請求頭和請求體。而responseType則用于指定返回的數據類型。使用exchange()方法發起請求的代碼示例如代碼清單4-14所示。
代碼清單4-14 exchange ()方法使用的示例代碼
ResponseEntity<User> result = restTemplate.exchange("http://localhost:8080/users/{id}", HttpMethod.GET, null, User.class, 100);
- iOS面試一戰到底
- Progressive Web Apps with React
- C語言程序設計基礎與實驗指導
- Python Game Programming By Example
- Mastering Rust
- Learning ELK Stack
- 快人一步:系統性能提高之道
- 精通MATLAB(第3版)
- Python編程從0到1(視頻教學版)
- HTML 5與CSS 3權威指南(第3版·上冊)
- Statistical Application Development with R and Python(Second Edition)
- Kivy Cookbook
- Solutions Architect's Handbook
- Getting Started with Polymer
- Data Science Algorithms in a Week