欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring RestTemplate使用方法示例總結(jié)

 更新時間:2025年04月12日 09:24:39   作者:申城異鄉(xiāng)人  
這篇文章主要介紹了Spring RestTemplate使用方法示例總結(jié),本文通過實例代碼給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧

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)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解Java爬蟲利器Jsoup

    詳解Java爬蟲利器Jsoup

    Jsoup是一款Java語言開發(fā)的HTML解析器,用于解析HTML文檔以及對HTML文檔進(jìn)行操作,處理等,本文就將詳細(xì)給大家介紹一下Java中的爬蟲利器Jsoup,感興趣的同學(xué)可以參考一下
    2023-06-06
  • JAVA三種異常處理機(jī)制的具體使用

    JAVA三種異常處理機(jī)制的具體使用

    異常是程序在編譯或執(zhí)行的過程中可能出現(xiàn)的問題,本文主要介紹了JAVA三種異常處理機(jī)制的具體使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-06-06
  • 使用spring aop統(tǒng)一處理異常和打印日志方式

    使用spring aop統(tǒng)一處理異常和打印日志方式

    這篇文章主要介紹了使用spring aop統(tǒng)一處理異常和打印日志方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Delegate IDE build/run actions to maven 配置會影響程序運行嗎?

    Delegate IDE build/run actions to maven 配置會影響程序運行嗎?

    這篇文章主要介紹了Delegate IDE build/run actions to maven 配置會影響程序運行嗎,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08
  • Java實戰(zhàn)寵物店在線交易平臺的實現(xiàn)流程

    Java實戰(zhàn)寵物店在線交易平臺的實現(xiàn)流程

    讀萬卷書不如行萬里路,只學(xué)書上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+Springboot+maven+Mysql+FreeMarker實現(xiàn)一個寵物在線交易系統(tǒng),大家可以在過程中查缺補(bǔ)漏,提升水平
    2022-01-01
  • Java編程實現(xiàn)提取文章中關(guān)鍵字的方法

    Java編程實現(xiàn)提取文章中關(guān)鍵字的方法

    這篇文章主要介紹了Java編程實現(xiàn)提取文章中關(guān)鍵字的方法,較為詳細(xì)的分析了Java提取文章關(guān)鍵字的原理與具體實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-11-11
  • java利用遞歸實現(xiàn)類別樹示例代碼

    java利用遞歸實現(xiàn)類別樹示例代碼

    這篇文章主要給大家介紹了關(guān)于java利用遞歸實現(xiàn)類別樹的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • Java?常量池詳解之class文件常量池?和class運行時常量池

    Java?常量池詳解之class文件常量池?和class運行時常量池

    這篇文章主要介紹了Java?常量池詳解之class文件常量池?和class運行時常量池,常量池主要存放兩大類常量:字面量,符號引用,本文結(jié)合示例代碼對java class常量池相關(guān)知識介紹的非常詳細(xì),需要的朋友可以參考下
    2022-12-12
  • Java httpclient請求form-data格式并設(shè)置boundary代碼實現(xiàn)方法

    Java httpclient請求form-data格式并設(shè)置boundary代碼實現(xiàn)方法

    在 Java 開發(fā)中,經(jīng)常會遇到需要使用 httpclient 發(fā)送 form-data 格式請求的場景,本文將詳細(xì)介紹如何正確地實現(xiàn)這一操作,包括數(shù)據(jù)格式示例、常見報錯及解決方法,本文通過實例代碼詳解講解,感興趣的朋友一起看看吧
    2025-01-01
  • Java中StopWatch工具類的用法詳解

    Java中StopWatch工具類的用法詳解

    stopWatch 是org.springframework.util 包下的一個工具類,使用它可直觀的輸出代碼執(zhí)行耗時,以及執(zhí)行時間百分比,下面就跟隨小編一起來看看它的具體用法吧
    2024-12-12

最新評論