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

在SpringBoot中使用RestTemplate詳解

 更新時間:2025年12月08日 09:46:40   作者:wsdhla  
文章介紹了配置文件、配置類和工具類的使用,并對比了RestTemplate與HttpClient/OkHttp在性能上的差異,后者由于使用了連接池,性能優(yōu)于前者

SpringBoot中使用RestTemplate

1、配置文件

# 最大連接數(shù)
http.maxTotal=100

# 并發(fā)數(shù)
http.defaultMaxPerRoute=20

# 客戶端創(chuàng)建連接超時時間
http.connectTimeout=10000

# 從連接池中獲取到連接的最長時間
http.connectionRequestTimeout=500

# 服務端響應超時時間
http.socketTimeout=30000

# 提交請求前測試連接是否可用
http.staleConnectionCheckEnabled=true

# 可用空閑連接過期時間,重用空閑連接時會先檢查是否空閑時間超過這個時間,如果超過,釋放socket重新建立
http.validateAfterInactivity=3000000

2、配置類

import org.apache.http.Header;
import org.apache.http.client.HttpClient;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.config.Registry;
import org.apache.http.config.RegistryBuilder;
import org.apache.http.conn.HttpClientConnectionManager;
import org.apache.http.conn.socket.ConnectionSocketFactory;
import org.apache.http.conn.socket.PlainConnectionSocketFactory;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.impl.client.DefaultConnectionKeepAliveStrategy;
import org.apache.http.impl.client.DefaultHttpRequestRetryHandler;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.message.BasicHeader;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.http.client.ClientHttpRequestFactory;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;

import java.util.ArrayList;
import java.util.List;


@Configuration
@ComponentScan("com.xxx")
@PropertySource(value = {"classpath:/xxx.properties", "classpath:/yyy.properties"}, encoding = "utf-8")
public class XxxConfiguration {
    @Value("${http.maxTotal}")
    private Integer maxTotal;

    @Value("${http.defaultMaxPerRoute}")
    private Integer defaultMaxPerRoute;

    @Value("${http.connectTimeout}")
    private Integer connectTimeout;

    @Value("${http.connectionRequestTimeout}")
    private Integer connectionRequestTimeout;

    @Value("${http.socketTimeout}")
    private Integer socketTimeout;

    @Value("${http.staleConnectionCheckEnabled}")
    private boolean staleConnectionCheckEnabled;

    @Value("${http.validateAfterInactivity}")
    private Integer validateAfterInactivity;

    /**
     * @description: Rest模板
     * @return: org.springframework.web.client.RestTemplate
     * @author: wsdhla
     * @date: 2022/06/27 16:34
     */
    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate(httpRequestFactory());
    }

    /**
     * @description: 請求連接池配置
     * @return: org.springframework.http.client.ClientHttpRequestFactory
     * @author: wsdhla
     * @date: 2022/06/27 16:35
     */
    @Bean
    public ClientHttpRequestFactory httpRequestFactory() {
        return new HttpComponentsClientHttpRequestFactory(httpClient());
    }

    /**
     * @description: HttpClient
     * @return: org.apache.http.client.HttpClient
     * @author: wsdhla
     * @date: 2022/06/27 16:42
     */
    @Bean
    public HttpClient httpClient() {
        RequestConfig requestConfig = RequestConfig.custom()
                .setSocketTimeout(socketTimeout)
                .setConnectTimeout(connectTimeout)
                .setStaleConnectionCheckEnabled(staleConnectionCheckEnabled)
                .setConnectionRequestTimeout(connectionRequestTimeout)
                .build();


        List<Header> headers = new ArrayList<>();
        headers.add(new BasicHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.16 Safari/537.36"));
        headers.add(new BasicHeader("Accept-Encoding", "gzip,deflate"));
        headers.add(new BasicHeader("Accept-Language", "zh-CN"));
        headers.add(new BasicHeader("Connection", "Keep-Alive"));
        headers.add(new BasicHeader("Content-type", "application/json;charset=UTF-8"));

        return HttpClientBuilder.create()
                .setDefaultRequestConfig(requestConfig)
                .setConnectionManager(poolingHttpClientConnectionManager())
                .setDefaultHeaders(headers)
                .setKeepAliveStrategy(new DefaultConnectionKeepAliveStrategy())
                .setRetryHandler(new DefaultHttpRequestRetryHandler(2, true))
                .build();
    }

    /**
     * @description: Http連接管理器
     * @return: org.apache.http.conn.HttpClientConnectionManager
     * @author: wsdhla
     * @date: 2022/06/27 16:41
     */
    @Bean
    public HttpClientConnectionManager poolingHttpClientConnectionManager() {
        Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create()
                .register("http", PlainConnectionSocketFactory.getSocketFactory())
                .register("https", SSLConnectionSocketFactory.getSocketFactory())
                .build();

        PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(registry);
        connectionManager.setMaxTotal(maxTotal);
        connectionManager.setDefaultMaxPerRoute(defaultMaxPerRoute);
        connectionManager.setValidateAfterInactivity(validateAfterInactivity);

        return connectionManager;
    }
}

3、工具類

import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestClientException;
import org.springframework.web.client.RestTemplate;

import javax.annotation.Resource;
import java.util.Map;


@Component
public class RestTemplateUtils {

    private static RestTemplate restTemplate;

    /**
     * POST請求調(diào)用方式
     * @param url          請求URL
     * @param requestBody  請求參數(shù)體
     * @param responseType 返回對象類型
     * @return ResponseEntity 響應對象封裝類
     */
    public static <T> ResponseEntity<T> post(String url, Object requestBody, Class<T> responseType)
            throws RestClientException {
        return restTemplate.postForEntity(url, requestBody, responseType);
    }

    @Resource
    public void setRestTemplate(RestTemplate restTemplate) {
        RestTemplateUtils.restTemplate = restTemplate;
    }
}

4、具體使用

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.add("acc-key", acc-key);

JSONObject requestParam = new JSONObject();
requestParam.put("code", code);
requestParam.put("message", message);

HttpEntity<String> requestBody = new HttpEntity<String>(JSON.toJSONString(requestParam), headers);

ResponseEntity<實體類> resp = RestTemplateUtils.post(url, requestBody, 實體類.class);

RestTemplate默認使用Java自帶的HttpURLConnection,沒有池化,會有性能問題,可以使用HttpClient或者OkHttp

HttpClient示例:

@Configuration
public class HttpClientExtConfig {

    @ConditionalOnMissingBean(RestTemplate.class)
    @Bean
    public RestTemplate restTemplate() {
        CloseableHttpClient httpClient = HttpClients.custom()
                .setConnectionManager(new PoolingHttpClientConnectionManager())
                .build();

        HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory();
        requestFactory.setHttpClient(httpClient);

        return new RestTemplate();
    }
}
<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5.13</version>
</dependency>

總結

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

相關文章

  • 詳解在Spring Boot框架下使用WebSocket實現(xiàn)消息推送

    詳解在Spring Boot框架下使用WebSocket實現(xiàn)消息推送

    這篇文章主要介紹了詳解在Spring Boot框架下使用WebSocket實現(xiàn)消息推送,具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2016-12-12
  • java數(shù)據(jù)結構之二分查找法 binarySearch的實例

    java數(shù)據(jù)結構之二分查找法 binarySearch的實例

    這篇文章主要介紹了java數(shù)據(jù)結構之二分查找法 binarySearch的實例的相關資料,希望通過本文能幫助到大家,讓大家理解掌握這部分內(nèi)容,需要的朋友可以參考下
    2017-10-10
  • Java設計模式之外觀模式

    Java設計模式之外觀模式

    這篇文章介紹了Java設計模式之外觀模式,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-09-09
  • 深入了解Java中的反射機制(reflect)

    深入了解Java中的反射機制(reflect)

    Java的反射機制允許我們對一個類的加載、實例化、調(diào)用方法、操作屬性的時期改為在運行期進行,這大大提高了代碼的靈活度,本文就來簡單講講反射機制的具體使用方法吧
    2023-05-05
  • Java練習之潛艇小游戲的實現(xiàn)

    Java練習之潛艇小游戲的實現(xiàn)

    這篇文章主要和大家分享一個Java小練習——利用Java編寫一個潛艇小游戲,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2022-03-03
  • Spring的@Validation和javax包下的@Valid區(qū)別以及自定義校驗注解

    Spring的@Validation和javax包下的@Valid區(qū)別以及自定義校驗注解

    這篇文章主要介紹了Spring的@Validation和javax包下的@Valid區(qū)別以及自定義校驗注解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-01-01
  • Spring Data JPA自動生成表時列順序混亂的最新解決辦法

    Spring Data JPA自動生成表時列順序混亂的最新解決辦法

    文章主要介紹了Spring Boot 3.3.5版本中SpringDataJPA自動生成表時列順序混亂的問題,以及如何通過替換Hibernate實現(xiàn)來解決這個問題,感興趣的朋友跟隨小編一起看看吧
    2024-11-11
  • SpringMVC請求/響應亂碼問題解決方案解析

    SpringMVC請求/響應亂碼問題解決方案解析

    這篇文章主要介紹了SpringMVC請求/響應亂碼問題解決方案解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-12-12
  • Java中?springcloud.openfeign應用案例解析

    Java中?springcloud.openfeign應用案例解析

    使用OpenFeign能讓編寫Web?Service客戶端更加簡單,使用時只需定義服務接口,然后在上面添加注解,OpenFeign也支持可拔插式的編碼和解碼器,這篇文章主要介紹了Java中?springcloud.openfeign應用案例解析,需要的朋友可以參考下
    2024-06-06
  • 使用@RequestBody傳遞多個不同對象方式

    使用@RequestBody傳遞多個不同對象方式

    這篇文章主要介紹了使用@RequestBody傳遞多個不同對象方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10

最新評論

福州市| 四川省| 崇明县| 华坪县| 晋江市| 民乐县| 五河县| 定边县| 大悟县| 颍上县| 资阳市| 东乡| 乌鲁木齐县| 黄骅市| 波密县| 常州市| 淅川县| 托里县| 凌海市| 锡林郭勒盟| 台前县| 瑞丽市| 海南省| 恩施市| 瑞丽市| 镇康县| 凤凰县| 曲阜市| 平原县| 临湘市| 平远县| 枞阳县| 岳普湖县| 吉隆县| 淮北市| 迁安市| 丹棱县| 诸暨市| 陇川县| 闵行区| 渝中区|