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

在SpringBoot中使用RestTemplate詳解

 更新時(shí)間: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)建連接超時(shí)時(shí)間
http.connectTimeout=10000

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

# 服務(wù)端響應(yīng)超時(shí)時(shí)間
http.socketTimeout=30000

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

# 可用空閑連接過期時(shí)間,重用空閑連接時(shí)會先檢查是否空閑時(shí)間超過這個(gè)時(shí)間,如果超過,釋放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 響應(yīng)對象封裝類
     */
    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<實(shí)體類> resp = RestTemplateUtils.post(url, requestBody, 實(shí)體類.class);

RestTemplate默認(rèn)使用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>

總結(jié)

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

相關(guān)文章

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

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

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

    java數(shù)據(jù)結(jié)構(gòu)之二分查找法 binarySearch的實(shí)例

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

    Java設(shè)計(jì)模式之外觀模式

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

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

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

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

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

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

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

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

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

    SpringMVC請求/響應(yīng)亂碼問題解決方案解析

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

    Java中?springcloud.openfeign應(yīng)用案例解析

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

    使用@RequestBody傳遞多個(gè)不同對象方式

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

最新評論

青海省| 会东县| 运城市| 天台县| 监利县| 朝阳市| 育儿| 安国市| 芜湖市| 广宁县| 泾川县| 临桂县| 榕江县| 博白县| 什邡市| 乃东县| 萨嘎县| 云南省| 稻城县| 怀远县| 神木县| 合水县| 水富县| 布拖县| 林西县| 桂阳县| 梅州市| 基隆市| 沿河| 普兰县| 扎兰屯市| 县级市| 永济市| 文昌市| 冀州市| 新乐市| 汝城县| 耒阳市| 抚州市| 香格里拉县| 长垣县|