spring mvc 中 RestTemplate 全面詳解及示例


RestTemplate 全面詳解及示例


1. RestTemplate 簡介
  • 定義:Spring 提供的同步 HTTP 客戶端,支持多種 HTTP 方法(GET/POST/PUT/DELETE 等),用于調用 RESTful API。
  • 核心特性
    • 支持請求頭、請求體、URI 參數的靈活配置。
    • 可直接返回 ResponseEntity 獲取狀態碼和響應頭。
    • 支持對象序列化(如 JSON)和反序列化。
  • 依賴(Spring Boot 項目):
    <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    

2. 示例代碼詳解

示例 1:GET 請求(帶請求頭,獲取狀態碼和響應頭)
// 1. 創建 RestTemplate 實例
RestTemplate restTemplate = new RestTemplate();// 2. 構建請求 URI(包含路徑參數)
String uri = "http://api.example.com/users/{id}";
Map<String, String> uriVariables = new HashMap<>();
uriVariables.put("id", "123");// 3. 設置請求頭
HttpHeaders headers = new HttpHeaders();
headers.set("Authorization", "Bearer token_123");
headers.setContentType(MediaType.APPLICATION_JSON);// 4. 發送 GET 請求并獲取 ResponseEntity
ResponseEntity<User> response = restTemplate.exchange(uri,HttpMethod.GET,new HttpEntity<>(headers), // 請求體為空,僅傳遞頭User.class, // 響應體反序列化類型uriVariables
);// 5. 處理響應
int statusCode = response.getStatusCodeValue(); // 獲取狀態碼
HttpHeaders responseHeaders = response.getHeaders(); // 獲取響應頭
User user = response.getBody(); // 獲取響應體對象

示例 2:POST 請求(傳遞 JSON 請求體)
// 1. 創建請求體對象(使用 Jackson 自動序列化)
User newUser = new User("John", 25);// 2. 構建請求頭
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);// 3. 創建 HttpEntity(包含頭和請求體)
HttpEntity<User> request = new HttpEntity<>(newUser, headers);// 4. 發送 POST 請求
ResponseEntity<String> response = restTemplate.postForEntity("http://api.example.com/users",request,String.class // 返回的響應類型(如成功返回 "Created")
);// 5. 處理響應
String locationHeader = response.getHeaders().getFirst("Location"); // 獲取 Location 頭

示例 3:PUT/PATCH 請求(更新資源)
// 1. 更新對象
User updatedUser = new User("John Doe", 26);// 2. 構建請求頭和請求體
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<User> request = new HttpEntity<>(updatedUser, headers);// 3. 發送 PUT 請求
ResponseEntity<Void> response = restTemplate.exchange("http://api.example.com/users/123",HttpMethod.PUT,request,Void.class // 無響應體時使用 Void
);// 4. 檢查狀態碼
if (response.getStatusCode() == HttpStatus.OK) {System.out.println("Update successful");
}

示例 4:DELETE 請求
// 發送 DELETE 請求
ResponseEntity<Void> response = restTemplate.exchange("http://api.example.com/users/123",HttpMethod.DELETE,null, // 無請求體Void.class
);if (response.getStatusCode() == HttpStatus.NO_CONTENT) {System.out.println("Resource deleted");
}

示例 5:自定義響應類型(如 Map)
// 將響應體反序列化為 Map
ResponseEntity<Map<String, Object>> response = restTemplate.getForEntity("http://api.example.com/data",new ParameterizedTypeReference<Map<String, Object>>() {}
);Map<String, Object> data = response.getBody();

示例 6:使用 ResponseExtractor 定制響應
// 自定義提取器:提取響應體中的某個字段
ResponseExtractor<String> extractor = response -> {if (response.getStatusCode() == HttpStatus.OK) {return response.getHeaders().getFirst("X-Custom-Header"); // 提取自定義頭}return null;
};// 使用 exchange 方法
String customHeader = restTemplate.exchange("http://api.example.com/headers",HttpMethod.GET,null,extractor // 傳遞自定義提取器
);

示例 7:批量操作(查詢多個資源)
// 使用 UriComponentsBuilder 構建帶查詢參數的 URI
UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl("http://api.example.com/users").queryParam("page", 1).queryParam("size", 10);// 發送 GET 請求并獲取列表
ResponseEntity<User[]> response = restTemplate.getForEntity(builder.toUriString(),User[].class
);User[] users = response.getBody();

3. 核心方法對比表格
方法HTTP 方法返回類型關鍵代碼片段適用場景
getForObjectGET對象(如 User)restTemplate.getForObject(url, User.class);簡單 GET 請求,直接返回對象
getForEntityGETResponseEntity<User>restTemplate.getForEntity(url, User.class);需獲取狀態碼或響應頭
postForObjectPOST對象(如 String)restTemplate.postForObject(url, request, String.class);POST 請求,直接返回結果
postForEntityPOSTResponseEntity<Void>restTemplate.postForEntity(url, request, Void.class);需檢查狀態碼或 Location 頭
exchange任意方法ResponseEntity<?>restTemplate.exchange(url, HttpMethod.POST, request, Class<T>);自定義 HTTP 方法和響應類型
deleteDELETEvoidrestTemplate.delete(url);簡單刪除操作

4. 關鍵配置與注意事項
  • 設置連接池(提升性能):

    RestTemplate restTemplate = new RestTemplate(new HttpClientErrorException.Factory(),new HttpComponentsClientHttpRequestFactory()
    );
    
  • 異常處理

    try {// 發送請求
    } catch (HttpClientErrorException e) {System.out.println("Client error: " + e.getStatusCode());
    } catch (HttpServerErrorException e) {System.out.println("Server error: " + e.getStatusCode());
    }
    
  • 自定義序列化器

    ObjectMapper objectMapper = new ObjectMapper();
    MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
    converter.setObjectMapper(objectMapper);
    restTemplate.getMessageConverters().add(converter);
    

5. 總結對比表格
需求實現方法關鍵代碼注意事項
發送 JSON 請求體使用 HttpEntity<User>HttpEntity<String>HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON);確保序列化配置正確
獲取狀態碼和響應頭返回 ResponseEntity<T>response.getStatusCode(); response.getHeaders();處理 2xx/4xx/5xx 狀態碼
自定義響應類型使用 ParameterizedTypeReference 或泛型new ParameterizedTypeReference<List<User>>() {}處理復雜泛型類型
響應提取器實現 ResponseExtractor 接口或使用預定義提取器restTemplate.exchange(url, HttpMethod.GET, null, extractor);簡化復雜響應處理邏輯

關鍵總結

  1. 核心類
    • RestTemplate:核心客戶端,提供所有 HTTP 方法。
    • HttpEntity:封裝請求頭和請求體。
    • ResponseEntity:封裝響應頭、狀態碼和響應體。
  2. 最佳實踐
    • 使用 exchange 方法統一處理復雜場景。
    • 通過 ResponseEntity 獲取完整響應信息。
    • 自定義 HttpMessageConverter 處理特殊序列化需求。
  3. 替代方案
    Spring Boot 3.x 已棄用 RestTemplate,推薦使用 WebClient(響應式、非阻塞)。

通過以上示例和配置,開發者可以靈活實現 REST API 的全場景調用需求。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/75497.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/75497.shtml
英文地址,請注明出處:http://en.pswp.cn/web/75497.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

北大:LLM在NL2SQL中任務分解

&#x1f4d6;標題&#xff1a;LearNAT: Learning NL2SQL with AST-guided Task Decomposition for Large Language Models &#x1f310;來源&#xff1a;arXiv, 2504.02327 &#x1f31f;摘要 &#x1f538;自然語言到SQL&#xff08;NL2SQL&#xff09;已成為實現與數據庫…

STM32LL庫編程系列第八講——ADC模數轉換

系列文章目錄 往期文章 STM32LL庫編程系列第一講——Delay精準延時函數&#xff08;詳細&#xff0c;適合新手&#xff09; STM32LL庫編程系列第二講——藍牙USART串口通信&#xff08;步驟詳細、原理清晰&#xff09; STM32LL庫編程系列第三講——USARTDMA通信 STM32LL庫編程…

網絡5 TCP/IP 虛擬機橋接模式、NAT、僅主機模式

TCP/IP模型 用于局域網和廣域網&#xff1b;多個協議&#xff1b;每一層呼叫下一層&#xff1b;四層&#xff1b;通用標準 TCP/IP模型 OSI七層模型 應用層 應用層 表示層 會話層 傳輸層 傳輸層 網絡層 網絡層 鏈路層 數據鏈路層 物理層 鏈路層&#xff1a;傳數據幀&#xff0…

【C語言】預處理(下)(C語言完結篇)

一、#和## 1、#運算符 這里的#是一個運算符&#xff0c;整個運算符會將宏的參數轉換為字符串字面量&#xff0c;它僅可以出現在帶參數的宏的替換列表中&#xff0c;我們可以將其理解為字符串化。 我們先看下面的一段代碼&#xff1a; 第二個printf中是由兩個字符串組成的&am…

【高性能緩存Redis_中間件】一、快速上手redis緩存中間件

一、鋪墊 在當今的軟件開發領域&#xff0c;消息隊列扮演著至關重要的角色。它能夠幫助我們實現系統的異步處理、流量削峰以及系統解耦等功能&#xff0c;從而提升系統的性能和可維護性。Redis 作為一款高性能的鍵值對數據庫&#xff0c;不僅提供了豐富的數據結構&#xff0c;…

Java如何獲取文件的編碼格式?

Java獲取文件的編碼格式 在計算機中&#xff0c;文件編碼是指將文件內容轉換成二進制形式以便存儲和傳輸的過程。常見的文件編碼格式包括UTF-8、GBK等。不同的編碼使用不同的字符集和字節序列&#xff0c;因此在讀取文件時需要正確地確定文件的編碼格式 Java提供了多種方式以獲…

客戶端負載均衡與服務器端負載均衡詳解

客戶端負載均衡與服務器端負載均衡詳解 1. 客戶端負載均衡&#xff08;Client-Side Load Balancing&#xff09; 核心概念 定義&#xff1a;負載均衡邏輯在客戶端實現&#xff0c;客戶端主動選擇目標服務實例。典型場景&#xff1a;微服務內部調用&#xff08;如Spring Cloud…

Quartus II的IP核調用及仿真測試

目錄 第一章 什么是IP核&#xff1f;第二章 什么是LPM&#xff1f;第一節 設置LPM_COUNTER模塊參數第二節 仿真 第三章 什么是PLL&#xff1f;第一節 設置ALTPLL&#xff08;嵌入式鎖相環&#xff09;模塊參數第二節 仿真 第四章 什么是RAM&#xff1f;第一節 RAM_1PORT的調用第…

各地物價和生活成本 東歐篇

東歐地區的物價差異相對較大&#xff0c;一些國家的物價較高&#xff0c;而另一些國家則相對便宜。這些差異主要受當地經濟發展水平、工資水平、旅游業發展以及國際關系等因素影響。以下是一些典型的東歐國家&#xff0c;按物價高低進行分類&#xff1a; &#x1f30d; 物價較高…

改進神經風格遷移

改進神經風格遷移&#xff08;Neural Style Transfer, NST&#xff09;可以從多個方向入手&#xff0c;包括模型結構優化、損失函數設計、計算效率提升、應用場景擴展等。以下是一些關鍵的改進方向及具體方法&#xff1a; 1. 模型結構優化 &#xff08;1&#xff09;輕量化網絡…

1、從零搭建魔法工坊:React 19 新手村生存指南

一、開篇&#xff1a;新世界的入場券 "你好&#xff0c;年輕的魔法學徒&#xff01;歡迎來到React魔法世界。我是你的向導赫敏韋斯萊&#xff0c;今天我們將用React 19這根全新魔杖&#xff0c;搭建屬于你的第一座魔法工坊。" ——以對話形式開場&#xff0c;消除技…

基于 Redis 實現一套動態配置中心 DCC 服務與反射基礎知識講解

目錄 動態配置中心核心價值 輕量級 Redis 方案與 ZooKeeper 的對比分析 為什么選擇自定義 Redis 方案&#xff1f; 1. 技術決策背景 一、活動降級攔截 1. 定義與作用 2. 實現原理 二、活動切量攔截 1. 定義與作用 2. 實現原理 三、兩者的核心區別 四、實際應用案例 1. 電商大促…

如何從項目目標到成功標準:構建可量化、可落地的項目評估體系

引言 在項目管理領域&#xff0c;"項目成功"的定義往往比表面看起來更復雜。根據PMI的行業報告&#xff0c;67%的項目失敗源于目標與成功標準的不匹配。當項目團隊僅關注"按時交付"或"預算達標"時&#xff0c;常會忽視真正的價值創造。本文將通…

深度學習基礎--CNN經典網絡之分組卷積與ResNext網絡實驗探究(pytorch復現)

&#x1f368; 本文為&#x1f517;365天深度學習訓練營 中的學習記錄博客&#x1f356; 原作者&#xff1a;K同學啊 前言 ResNext是分組卷積的開始之作&#xff0c;這里本文將學習ResNext網絡&#xff1b;本文復現了ResNext50神經網絡&#xff0c;并用其進行了猴痘病分類實驗…

SQL 全文檢索原理

全文檢索(Full-Text Search)是SQL中用于高效搜索文本數據的技術&#xff0c;與傳統的LIKE操作或簡單字符串比較相比&#xff0c;它能提供更強大、更靈活的文本搜索能力。 基本概念 全文檢索的核心思想是將文本內容分解為可索引的單元(通常是詞或詞組)&#xff0c;然后建立倒排…

【Linux】Orin NX編譯 linux 內核及內核模塊

1、下載交叉編譯工具:gcc 1)下載地址:https://developer.nvidia.com/embedded/jetson-linux 選擇TOOLS中的交叉編譯工具:gcc 11.3 2)解壓 將gcc編譯器解壓到指定目錄中,如:/home/laoer/nvidia/gcc 3)配置環境變量 創建: ~/nvidia/gcc/env.sh添加: #!/bin/bash e…

Transformers 是工具箱,BERT 是工具。

Transformers 是工具箱&#xff0c;BERT 是工具。 &#x1f50d; 詳細解釋&#xff1a; 名稱作用比喻理解舉例&#x1f916; transformers&#xff08;庫&#xff09;一個框架&#xff0c;提供很多 NLP 模型的“使用方式”&#xff0c;包括文本分類、問答、摘要等相當于一個“…

k8s之Service類型詳解

1.ClusterIP 類型 2.NodePort 類型 3.LoadBalancer 類型 4.ExternalName 類型 類型為 ExternalName 的 Service 將 Service 映射到 DNS 名稱&#xff0c;而不是典型的選擇算符&#xff0c; 例如 my-service 或者 cassandra。你可以使用 spec.externalName 參數指定這些服務…

find指令中使用正則表達式

linux查找命令能結合正則表達式嗎 find命令要使用正則表達式需要結合-regex參數 另&#xff0c;-type參數可以指定查找類型(f為文件&#xff0c;d為文件夾) rootlocalhost:~/regular_expression# ls -alh 總計 8.0K drwxr-xr-x. 5 root root 66 4月 8日 16:26 . dr-xr-…

《穿透表象,洞察分布式軟總線“無形”之奧秘》

分布式系統已成為眾多領域的關鍵支撐技術&#xff0c;而分布式軟總線作為實現設備高效互聯的核心技術&#xff0c;正逐漸走入大眾視野。它常被描述為一條“無形”的總線&#xff0c;這一獨特屬性不僅是理解其技術內涵的關鍵&#xff0c;更是把握其在未來智能世界中重要作用的切…