【五一创作】在SpringBoot中使用RestTemplate

1、配置文件

# 最大连接数
http.maxTotal=100

# 并发数
http.defaultMaxPerRoute=20

# 客户端创建连接超时时间
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请求调用方式
     * @param url          请求URL
     * @param requestBody  请求参数体
     * @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();
    }
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,以下是一个简单的Android Studio图书管理系统的实现步骤: 1. 创建一个新的Android Studio项目。 2. 在项目创建一个SQLite数据库用于保存图书信息。 3. 创建一个Activity用于显示图书列表。 4. 在Activity添加一个ListView用于显示图书列表。 5. 创建一个Adapter用于将图书信息加载到ListView。 6. 创建一个Activity用于添加新的图书到数据库。 7. 在该Activity添加表单控件用于输入新图书的信息。 8. 创建一个按钮用于将新图书添加到数据库。 9. 创建一个Activity用于编辑或删除已存在的图书信息。 10. 在该Activity添加表单控件用于编辑或删除图书信息。 11. 创建一个按钮用于保存更新后的图书信息或删除图书。 12. 在主Activity添加按钮用于打开添加或编辑图书的Activity。 在开发过程,需要注意以下几点: 1. 在创建SQLite数据库时,需要定义表格和相关字段,并编写相应的增删改查操作。 2. 在ListView显示图书信息时,需要使用Adapter将图书信息加载到ListView,同时需要设置点击事件用于打开编辑或删除图书的Activity。 3. 在添加或编辑图书的Activity,需要使用Intent传递数据,以便在保存或删除图书时更新数据库。 4. 在保存或删除图书时,需要编写相应的SQL语句并执行。 以上就是一个简单的Android Studio图书管理系统的实现步骤,具体实现过程需要根据需求进行相应的调整和修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wsdhla

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值