Spring RestTemplate使用方法示例總結(jié)
1. 引入依賴
首先,需要確認(rèn)項目中是否直接或者間接引入過spring-web依賴,如果沒有引入過,需要在pom.xml中添加以下代碼引入依賴:
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>4.3.24.RELEASE</version> </dependency>
2. 發(fā)送GET請求
使用RestTemplate發(fā)送GET請求主要有getForObject()
和getForEntity()
2個方法,每個方法分別提供了3種不同的重載。
2.1 使用getForObject發(fā)送GET請求(無參數(shù))
使用getForObject()
實現(xiàn):
RestTemplate restTemplate = new RestTemplate(); String url = "https://www.example.com/getCurrentEnv"; String response = restTemplate.getForObject(url, String.class); System.out.println(response);
假設(shè)以上接口返回的報文為:
{ "serverAddress": "www.example.dev.com", "env": "dev" }
也可以直接解析為自定義的類型:
import lombok.Getter; import lombok.Setter; @Getter @Setter public class EnvInfo { private String serverAddress; private String env; }
RestTemplate restTemplate = new RestTemplate(); String url = "https://www.example.com/getCurrentEnv"; EnvInfo response = restTemplate.getForObject(url, EnvInfo.class); System.out.println(JSON.toJSONString(response));
2.2 使用getForEntity發(fā)送GET請求(無參數(shù))
也可以使用getForEntity()
實現(xiàn)和2.1同樣的功能,代碼如下所示:
RestTemplate restTemplate = new RestTemplate(); String url = "https://www.example.com/getCurrentEnv"; ResponseEntity<EnvInfo> responseEntity = restTemplate.getForEntity(url, EnvInfo.class); if (responseEntity.getStatusCode() == HttpStatus.OK) { EnvInfo response = responseEntity.getBody(); System.out.println(JSON.toJSONString(response)); }
2.3 使用getForObject發(fā)送GET請求(帶參數(shù))
第一種方法是直接在url上拼接上參數(shù),如下所示:
RestTemplate restTemplate = new RestTemplate(); String url = "https://www.example.com/getDataList?pageIndex=1&pageSize=20"; EnvInfo response = restTemplate.getForObject(url, EnvInfo.class); System.out.println(JSON.toJSONString(response));
第二種方法是使用占位符添加參數(shù),如下所示:
RestTemplate restTemplate = new RestTemplate(); String url = "https://www.example.com/getDataList?pageIndex={1}&pageSize={2}"; EnvInfo response = restTemplate.getForObject(url, EnvInfo.class, 1, 20); System.out.println(JSON.toJSONString(response));
以上代碼也可以替換為:
RestTemplate restTemplate = new RestTemplate(); String url = "https://www.example.com/getDataList?pageIndex={pageIndex}&pageSize={pageSize}"; Map<String, String> uriVariables = new HashMap<>(); uriVariables.put("pageIndex", "1"); uriVariables.put("pageSize", "20"); EnvInfo response = restTemplate.getForObject(url, EnvInfo.class, uriVariables); System.out.println(JSON.toJSONString(response));
注意事項:
uriVariables中的key必須和url中的占位符名稱一致,否則會拋出異常:
java.lang.IllegalArgumentException: Map has no value for 'pageIndex'
第三種方法是使用UriComponentsBuilder
添加參數(shù),該種方法相比于前兩種方法更加靈活,可以實現(xiàn)動態(tài)添加參數(shù),代碼如下所示:
RestTemplate restTemplate = new RestTemplate(); String httpUrl = "https://www.example.com/getDataList"; UriComponentsBuilder uriComponentsBuilder = UriComponentsBuilder.fromHttpUrl(httpUrl); uriComponentsBuilder.queryParam("pageIndex", 1); uriComponentsBuilder.queryParam("pageSize", 20); String url = uriComponentsBuilder.toUriString(); EnvInfo response = restTemplate.getForObject(url, EnvInfo.class); System.out.println(JSON.toJSONString(response));
2.4 使用getForEntity發(fā)送GET請求(帶參數(shù))
也可以使用getForEntity()
實現(xiàn)和2.3同樣的功能,代碼如下所示:
RestTemplate restTemplate = new RestTemplate(); String httpUrl = "https://www.example.com/getDataList"; UriComponentsBuilder uriComponentsBuilder = UriComponentsBuilder.fromHttpUrl(httpUrl); uriComponentsBuilder.queryParam("pageIndex", 1); uriComponentsBuilder.queryParam("pageSize", 20); String url = uriComponentsBuilder.toUriString(); ResponseEntity<EnvInfo> responseEntity = restTemplate.getForEntity(url, EnvInfo.class); if (responseEntity.getStatusCode() == HttpStatus.OK) { EnvInfo response = responseEntity.getBody(); System.out.println(JSON.toJSONString(response)); }
2.5 getForObject與getForEntity的區(qū)別
getForEntity()
與getForObject()
相比,返回值用了ResponseEntity
進(jìn)行封裝,可以多獲取到以下2種信息:
- HTTP狀態(tài)碼
- Response Headers
代碼示例:
RestTemplate restTemplate = new RestTemplate(); String httpUrl = "https://www.example.com/getDataList"; UriComponentsBuilder uriComponentsBuilder = UriComponentsBuilder.fromHttpUrl(httpUrl); uriComponentsBuilder.queryParam("pageIndex", 1); uriComponentsBuilder.queryParam("pageSize", 20); String url = uriComponentsBuilder.toUriString(); ResponseEntity<EnvInfo> responseEntity = restTemplate.getForEntity(url, EnvInfo.class); System.out.println("statusCode: " + responseEntity.getStatusCode().toString()); System.out.println("statusCodeValue: " + responseEntity.getStatusCodeValue()); responseEntity.getHeaders().forEach((key, values) -> { System.out.println(key + ": " + values); });
輸出結(jié)果:
statusCode: 200
statusCodeValue: 200
Server: [openresty]
Date: [Thu, 10 Apr 2025 05:39:02 GMT]
Content-Type: [application/json]
Transfer-Encoding: [chunked]
Connection: [keep-alive]
其中Response Headers輸出部分和Chrome瀏覽器Network中的Response Headers是一致的:
2.6 發(fā)送GET請求(帶參數(shù)及請求頭)
一般情況下,請求第三方接口都需要簽名、時間戳等請求頭,但getForObject()
和getForEntity()
都不支持,
此時需要使用exchange()
方法,代碼如下所示:
RestTemplate restTemplate = new RestTemplate(); String httpUrl = "https://www.example.com/getDataList"; UriComponentsBuilder uriComponentsBuilder = UriComponentsBuilder.fromHttpUrl(httpUrl); uriComponentsBuilder.queryParam("pageIndex", 1); uriComponentsBuilder.queryParam("pageSize", 20); HttpHeaders headers = new HttpHeaders(); headers.set("signature", "3045022100875efcef9eb54626bb0168a6baa7c61265d0001d49243f"); headers.set("timestamp", String.valueOf(System.currentTimeMillis())); String url = uriComponentsBuilder.toUriString(); ResponseEntity<EnvInfo> responseEntity = restTemplate.exchange(url, HttpMethod.GET, new HttpEntity<>(headers), EnvInfo.class); if (responseEntity.getStatusCode() == HttpStatus.OK) { EnvInfo response = responseEntity.getBody(); System.out.println(JSON.toJSONString(response)); }
3. 發(fā)送POST請求
使用RestTemplate發(fā)送POST請求主要有postForObject()
和postForEntity()
2個方法,每個方法分別提供了3種不同的重載。
3.1 發(fā)送POST請求(帶參數(shù)、json方式)
使用postForObject()
實現(xiàn):
RestTemplate restTemplate = new RestTemplate(); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON_UTF8); LoginParams loginParams = new LoginParams(); loginParams.setUsername("zhangsan"); loginParams.setPassword("123456"); HttpEntity<LoginParams> request = new HttpEntity<>(loginParams, headers); String url = "https://www.example.com/login"; String response = restTemplate.postForObject(url, request, String.class); System.out.println(response);
LoginParams的定義如下所示:
import lombok.Getter; import lombok.Setter; @Getter @Setter public class LoginParams { private String username; private String password; }
假設(shè)以上接口返回的報文為:
{ "code": 200, "expire": "2025-04-11 14:42:22", "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NDQzNTM3NDIsImlkZW50aXR5" }
也可以直接解析為自定義的類型:
import lombok.Getter; import lombok.Setter; @Getter @Setter public class LoginResponse { private Integer code; private String expire; private String token; }
RestTemplate restTemplate = new RestTemplate(); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON_UTF8); LoginParams loginParams = new LoginParams(); loginParams.setUsername("zhangsan"); loginParams.setPassword("123456"); HttpEntity<LoginParams> request = new HttpEntity<>(loginParams, headers); String url = "https://www.example.com/login"; LoginResponse response = restTemplate.postForObject(url, request, LoginResponse.class); System.out.println(JSON.toJSONString(response));
也可以使用postForEntity()
實現(xiàn)同樣的功能,代碼如下所示:
ResponseEntity<LoginResponse> responseEntity = restTemplate.postForEntity(url, request, LoginResponse.class); if (responseEntity.getStatusCode() == HttpStatus.OK) { LoginResponse response = responseEntity.getBody(); System.out.println(JSON.toJSONString(response)); }
3.2 發(fā)送POST請求(帶參數(shù)、form表單方式)
使用postForObject()
實現(xiàn):
RestTemplate restTemplate = new RestTemplate(); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); MultiValueMap<String, String> map = new LinkedMultiValueMap<>(); map.add("username", "zhangsan"); map.add("password", "123456"); HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<>(map, headers); String url = "https://www.example.com/login"; LoginResponse response = restTemplate.postForObject(url, request, LoginResponse.class); System.out.println(JSON.toJSONString(response));
也可以使用postForEntity()
實現(xiàn)同樣的功能,代碼如下所示:
ResponseEntity<LoginResponse> responseEntity = restTemplate.postForEntity(url, request, LoginResponse.class); if (responseEntity.getStatusCode() == HttpStatus.OK) { LoginResponse response = responseEntity.getBody(); System.out.println(JSON.toJSONString(response)); }
3.3 postForObject與postForEntity的區(qū)別
postForObject()
與postForEntity()
的區(qū)別,與getForEntity()
與getForObject()
的區(qū)別一樣,
返回值用了ResponseEntity
進(jìn)行封裝。
4. 超時時間設(shè)置
如果需要自定義HTTP請求的連接超時時間和數(shù)據(jù)傳輸超時時間,代碼如下所示:
import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.client.SimpleClientHttpRequestFactory; import org.springframework.web.client.RestTemplate; @Configuration public class RestTemplateConfig { @Value("${restTemplate.connectTimeout:5000}") private int connectTimeout; @Value("${restTemplate.readTimeout:10000}") private int readTimeout; @Bean public RestTemplate restTemplate() { SimpleClientHttpRequestFactory simpleClientHttpRequestFactory = new SimpleClientHttpRequestFactory(); simpleClientHttpRequestFactory.setConnectTimeout(connectTimeout); simpleClientHttpRequestFactory.setReadTimeout(readTimeout); return new RestTemplate(simpleClientHttpRequestFactory); } }
到此這篇關(guān)于Spring RestTemplate使用方法總結(jié)的文章就介紹到這了,更多相關(guān)Spring RestTemplate使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot3 RestTemplate配置與使用詳解
- SpringBoot使用RestTemplate實現(xiàn)HTTP請求詳解
- SpringBoot中RestTemplate的使用詳解
- springboot中的RestTemplate使用詳解
- SpringBoot使用RestTemplate的示例詳解
- RestTemplate在Spring或非Spring環(huán)境下使用精講
- Springboot之restTemplate的配置及使用方式
- Spring使用RestTemplate和Junit單元測試的注意事項
- SpringBoot 如何使用RestTemplate發(fā)送Post請求
- 關(guān)于springboot 中使用httpclient或RestTemplate做MultipartFile文件跨服務(wù)傳輸?shù)膯栴}
相關(guān)文章
使用spring aop統(tǒng)一處理異常和打印日志方式
這篇文章主要介紹了使用spring aop統(tǒng)一處理異常和打印日志方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06Delegate IDE build/run actions to maven 配置會影響程序運行嗎?
這篇文章主要介紹了Delegate IDE build/run actions to maven 配置會影響程序運行嗎,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-08-08Java實戰(zhàn)寵物店在線交易平臺的實現(xiàn)流程
讀萬卷書不如行萬里路,只學(xué)書上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+Springboot+maven+Mysql+FreeMarker實現(xiàn)一個寵物在線交易系統(tǒng),大家可以在過程中查缺補(bǔ)漏,提升水平2022-01-01Java編程實現(xiàn)提取文章中關(guān)鍵字的方法
這篇文章主要介紹了Java編程實現(xiàn)提取文章中關(guān)鍵字的方法,較為詳細(xì)的分析了Java提取文章關(guān)鍵字的原理與具體實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-11-11Java?常量池詳解之class文件常量池?和class運行時常量池
這篇文章主要介紹了Java?常量池詳解之class文件常量池?和class運行時常量池,常量池主要存放兩大類常量:字面量,符號引用,本文結(jié)合示例代碼對java class常量池相關(guān)知識介紹的非常詳細(xì),需要的朋友可以參考下2022-12-12Java httpclient請求form-data格式并設(shè)置boundary代碼實現(xiàn)方法
在 Java 開發(fā)中,經(jīng)常會遇到需要使用 httpclient 發(fā)送 form-data 格式請求的場景,本文將詳細(xì)介紹如何正確地實現(xiàn)這一操作,包括數(shù)據(jù)格式示例、常見報錯及解決方法,本文通過實例代碼詳解講解,感興趣的朋友一起看看吧2025-01-01