最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Springboot之restTemplate配置及使用方式

 更新時間:2025年04月19日 11:12:05   作者:L-960  
這篇文章主要介紹了Springboot之restTemplate配置及使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

Springboot之restTemplate配置及使用

在springboot項目中,可以直接注入RestTemplate使用,也可進行簡單配置

基礎(chǔ)配置

@Configuration
public class RestTemplateConfig {

   @Bean
   public RestTemplate restTemplate(ClientHttpRequestFactory factory) {
       return new RestTemplate(factory);
   }

   @Bean
   public ClientHttpRequestFactory simpleClientHttpRequestFactory() {
       SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
       factory.setReadTimeout(150000); // ms
       factory.setConnectTimeout(150000); // ms
       return factory;
   }
}

以下為進階配置和使用

1 場景

java開發(fā)中,使用http連接,訪問第三方網(wǎng)絡(luò)接口,通常使用的連接工具為HttpClientOKHttp。

這兩種連接工具,使用起來比較復(fù)雜,新手容易出問題。如果使用spring框架,可以使用restTemplate來進行http連接請求。

restTemplate默認(rèn)的連接方式是java中的HttpConnection,可以使用ClientHttpRequestFactory指定不同的HTTP連接方式。

2 依賴

maven依賴如下:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>5.2.2.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5.7</version>
</dependency>

3 配置

 import org.apache.http.client.HttpClient;
import org.apache.http.conn.HttpClientConnectionManager;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.ClientHttpRequestFactory;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;

@Configuration
public class RestTemplateConfig {
    
    /**
     * http連接管理器
     * @return
     */
    @Bean
    public HttpClientConnectionManager poolingHttpClientConnectionManager() {
        /*// 注冊http和https請求
        Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create()
                .register("http", PlainConnectionSocketFactory.getSocketFactory())
                .register("https", SSLConnectionSocketFactory.getSocketFactory())
                .build();
        PoolingHttpClientConnectionManager poolingHttpClientConnectionManager = new PoolingHttpClientConnectionManager(registry);*/
        
        PoolingHttpClientConnectionManager poolingHttpClientConnectionManager = new PoolingHttpClientConnectionManager();
        // 最大連接數(shù)
        poolingHttpClientConnectionManager.setMaxTotal(500);
        // 同路由并發(fā)數(shù)(每個主機的并發(fā))
        poolingHttpClientConnectionManager.setDefaultMaxPerRoute(100);
        return poolingHttpClientConnectionManager;
    }
    
    /**
     * HttpClient
     * @param poolingHttpClientConnectionManager
     * @return
     */
    @Bean
    public HttpClient httpClient(HttpClientConnectionManager poolingHttpClientConnectionManager) {
        HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();
        // 設(shè)置http連接管理器
        httpClientBuilder.setConnectionManager(poolingHttpClientConnectionManager);
        
        /*// 設(shè)置重試次數(shù)
        httpClientBuilder.setRetryHandler(new DefaultHttpRequestRetryHandler(3, true));*/
        
        // 設(shè)置默認(rèn)請求頭
        /*List<Header> headers = new ArrayList<>();
        headers.add(new BasicHeader("Connection", "Keep-Alive"));
        httpClientBuilder.setDefaultHeaders(headers);*/
        
        return httpClientBuilder.build();
    }
    
    /**
     * 請求連接池配置
     * @param httpClient
     * @return
     */
    @Bean
    public ClientHttpRequestFactory clientHttpRequestFactory(HttpClient httpClient) {
        HttpComponentsClientHttpRequestFactory clientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory();
        // httpClient創(chuàng)建器
        clientHttpRequestFactory.setHttpClient(httpClient);
        // 連接超時時間/毫秒(連接上服務(wù)器(握手成功)的時間,超出拋出connect timeout)
        clientHttpRequestFactory.setConnectTimeout(5 * 1000);
        // 數(shù)據(jù)讀取超時時間(socketTimeout)/毫秒(務(wù)器返回數(shù)據(jù)(response)的時間,超過拋出read timeout)
        clientHttpRequestFactory.setReadTimeout(10 * 1000);
        // 連接池獲取請求連接的超時時間,不宜過長,必須設(shè)置/毫秒(超時間未拿到可用連接,會拋出org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for connection from pool)
        clientHttpRequestFactory.setConnectionRequestTimeout(10 * 1000);
        return clientHttpRequestFactory;
    }
    
    /**
     * rest模板
     * @return
     */
    @Bean
    public RestTemplate restTemplate(ClientHttpRequestFactory clientHttpRequestFactory) {
        // boot中可使用RestTemplateBuilder.build創(chuàng)建
        RestTemplate restTemplate = new RestTemplate();
        // 配置請求工廠
        restTemplate.setRequestFactory(clientHttpRequestFactory);
        return restTemplate;
    }
    
}

4 使用

使用到的實體類如下:

    @Data
    @ToString
    public class TempUser implements Serializable {
        private String userName;   
        private Integer age;
    }

4.1 GET請求

后臺接口代碼:

    @RequestMapping("getUser")
    public TempUser getUser(TempUser form) {
        TempUser tempUser = new TempUser();
        tempUser.setUserName(form.getUserName());
        tempUser.setAge(form.getAge());
        return tempUser;
    }

4.1.1 普通訪問

TempUser result = restTemplate.getForObject("http://localhost:8080/cs-admin/rest/getUser?userName=張三&amp;age=18", TempUser.class);

4.1.2 返回HTTP狀態(tài)

ResponseEntity<TempUser> responseEntity = restTemplate.getForEntity("http://localhost:8080/cs-admin/rest/getUser?userName=張三&age=18", TempUser.class);
// 獲取狀態(tài)對象
HttpStatus httpStatus = responseEntity.getStatusCode();
// 獲取狀態(tài)碼
int statusCodeValue = responseEntity.getStatusCodeValue();
// 獲取headers
HttpHeaders httpHeaders = responseEntity.getHeaders();
// 獲取body
TempUser result = responseEntity.getBody();

4.1.3 映射請求參數(shù)

Map<String, Object> paramMap = new HashMap<>();
paramMap.put("userName", "張三");
paramMap.put("age", 18);
TempUser result = restTemplate.getForObject("http://localhost:8080/cs-admin/rest/getUser?userName={userName}&age={age}", TempUser.class, paramMap);

4.2 POST請求

4.2.1 普通訪問

后臺接口代碼:

	RequestMapping("getPostUser")
    public TempUser getPostUser(@RequestBody TempUser form) {
    TempUser tempUser = new TempUser();
    tempUser.setUserName(form.getUserName());
    tempUser.setAge(form.getAge());
    return tempUser;
}

(1)普通訪問接口

TempUser param = new TempUser();
param.setUserName("張三");
param.setAge(18);
TempUser result = restTemplate.postForObject("http://localhost:8080/cs-admin/rest/getPostUser", param, TempUser.class);

(2)帶HEAD訪問接口

// 請求頭信息
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.valueOf("application/json;charset=UTF-8"));
//headers.add("headParam1", "headParamValue");

// 請求體內(nèi)容
TempUser param = new TempUser();
param.setUserName("張三");
param.setAge(18);

// 組裝請求信息
HttpEntity<TempUser> httpEntity=new HttpEntity<>(param,headers);

TempUser result = restTemplate.postForObject("http://localhost:8080/cs-admin/rest/getPostUser", httpEntity, TempUser.class);

4.2.2 無請求體的訪問

僅method為post,傳參方式仍然為get的param方式

后臺接口代碼:

@RequestMapping("getPostUserNoBody")
public TempUser getPostUserNoBody(TempUser form) {
    TempUser tempUser = new TempUser();
    tempUser.setUserName(form.getUserName());
    tempUser.setAge(form.getAge());
    return tempUser;
}

訪問方式:

Map<String, Object> paramMap = new HashMap<>();
paramMap.put("userName", "張三");
paramMap.put("age", 18);
TempUser result = restTemplate.postForObject("http://localhost:8080/cs-admin/rest/getPostUserNoBody?userName={userName}&age={age}", null, TempUser.class, paramMap);
System.out.println(result);

4.2.3 發(fā)送可攜帶文件的請求

public static void main(String[] args) {
    final RestTemplate restTemplate = new RestTemplate();

    MultiValueMap<String, Object> map = new LinkedMultiValueMap<>();

    map.add("fileUuid","oldDocumentTrans.getFileUuid()");
    map.add("sourceLanguageAbbreviation","en");
    map.add("targetLanguageAbbreviation","zh");
    HttpHeaders headers = new HttpHeaders();
    HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(map, headers);
    final ResponseEntity<String> stringResponseEntity = restTemplate.postForEntity("http://localhost:8055/documentTrans/updateLanguages",
            map,
            String.class);

    System.out.println(stringResponseEntity);
    }

4.3 上傳文件

后臺接口代碼:

@RequestMapping("uploadFile")
public TempUser uploadFile(HttpServletRequest request, TempUser form) {
 MultipartHttpServletRequest multipartHttpServletRequest = (MultipartHttpServletRequest) request;
 //獲取文件信息
 MultipartFile multipartFile = multipartHttpServletRequest.getFile("file");
 TempUser tempUser = new TempUser();
 if (multipartFile != null) {
     tempUser.setUserName(form.getUserName()+" "+multipartFile.getOriginalFilename());
 }
 if(form!=null){
     tempUser.setAge(form.getAge());
 }
 return tempUser;
}

訪問方式:

// 文件
FileSystemResource file=new FileSystemResource("D:\\Elasticsearch權(quán)威指南(中文版).pdf");

// 設(shè)置請求內(nèi)容
MultiValueMap<String, Object> param=new LinkedMultiValueMap<>();
param.add("file", file);
// 其他參數(shù)
param.add("userName", "張三");
param.add("age", 18);

// 組裝請求信息
HttpEntity<MultiValueMap<String, Object>> httpEntity=new HttpEntity<>(param);

// 發(fā)送請求
TempUser result = restTemplate.postForObject("http://localhost:8080/cs-admin/rest/uploadFile", httpEntity, TempUser.class);

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Mybatis批量更新三種方式的實現(xiàn)

    Mybatis批量更新三種方式的實現(xiàn)

    這篇文章主要介紹了Mybatis批量更新三種方式的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-02-02
  • SpringMVC對日期類型的轉(zhuǎn)換示例

    SpringMVC對日期類型的轉(zhuǎn)換示例

    本篇文章主要介紹了SpringMVC對日期類型的轉(zhuǎn)換示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-02-02
  • idea更改項目(模塊)JDK版本的操作步驟

    idea更改項目(模塊)JDK版本的操作步驟

    idea很多地方都設(shè)置了jdk版本,不同模塊的jdk版本也可能不一樣,下面這篇文章主要給大家介紹了關(guān)于idea更改項目(模塊)JDK版本的操作步驟,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-11-11
  • jmeter基礎(chǔ)邏輯控制器之if控制器的使用

    jmeter基礎(chǔ)邏輯控制器之if控制器的使用

    在實際工作中,當(dāng)使用JMeter做性能腳本或者接口腳本時,當(dāng)遇到需要對不同的條件做不同的操作時,我們可以使用JMeter中if控制器來實現(xiàn),本文就詳細(xì)的介紹一下如何使用
    2021-11-11
  • Spring?Cloud?Gateway中netty線程池優(yōu)化示例詳解

    Spring?Cloud?Gateway中netty線程池優(yōu)化示例詳解

    這篇文章主要介紹了Spring?Cloud?Gateway中netty線程池優(yōu)化示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07
  • SpringBoot緩存Ehcache的使用詳解

    SpringBoot緩存Ehcache的使用詳解

    EhCache、Redis比較常用,使用Redis的時候需要先安裝Redis服務(wù)器,本文給大家介紹SpringBoot緩存Ehcache的使用詳解,感興趣的朋友跟隨小編一起看看吧
    2022-03-03
  • SpringBoot?AOP?Redis實現(xiàn)延時雙刪功能實戰(zhàn)

    SpringBoot?AOP?Redis實現(xiàn)延時雙刪功能實戰(zhàn)

    本文主要介紹了SpringBoot?AOP?Redis實現(xiàn)延時雙刪功能實戰(zhàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • java 輸入一個數(shù)字,反轉(zhuǎn)輸出這個數(shù)字的值(實現(xiàn)方法)

    java 輸入一個數(shù)字,反轉(zhuǎn)輸出這個數(shù)字的值(實現(xiàn)方法)

    下面小編就為大家?guī)硪黄猨ava 輸入一個數(shù)字,反轉(zhuǎn)輸出這個數(shù)字的值(實現(xiàn)方法)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-10-10
  • 一篇文章弄懂Java和Kotlin的泛型難點

    一篇文章弄懂Java和Kotlin的泛型難點

    這篇文章主要給大家介紹了如何通過一篇文章弄懂Java和Kotlin的泛型難點的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • 基于spring-boot-maven-plugin插件打包lib文件外置的方法(layout模式為ZIP模式)

    基于spring-boot-maven-plugin插件打包lib文件外置的方法(layout模式為ZIP模式)

    Maven是一個插件執(zhí)行框架,所有工作都由插件完成,同時?Maven?基于構(gòu)建生命周期的核心概念,明確定義了構(gòu)建和分發(fā)特定工件(項目)的過程,接下來通過本文給大家介紹下基于spring-boot-maven-plugin插件打包lib文件外置(layout模式為ZIP模式),需要的朋友可以參考下
    2022-09-09

最新評論

合江县| 纳雍县| 临泽县| 周宁县| 吉隆县| 平顺县| 射阳县| 莲花县| 钟祥市| 马龙县| 冀州市| 临西县| 涞水县| 辽源市| 乌拉特中旗| 阿巴嘎旗| 布尔津县| 清远市| 广饶县| 武清区| 新疆| 长寿区| 木兰县| 逊克县| 永平县| 肇源县| 新乐市| 南丹县| 商城县| 孝义市| 天门市| 法库县| 旌德县| 石门县| 牡丹江市| 潮安县| 延长县| 饶阳县| 宿松县| 杭锦旗| 蒙自县|