首页 > 其他分享 >RestTemplate+OkHttp3整合(一)

RestTemplate+OkHttp3整合(一)

时间:2024-03-05 16:34:53浏览次数:23  
标签:info log request RestTemplate OkHttp3 整合 import new response

代码(HTTP、HTTPS)

一、POM

<!-okhttp->
<dependency>
    <groupId>com.squareup.okhttp3</groupId>
    <artifactId>okhttp</artifactId>
    <version>3.10.0</version>
</dependency>

<!-非必要,这里解析流数据时用了一下->
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>${commons-io.version}</version>
</dependency>

<!--非必要,okhttp预置日志拦截器-->
<dependency>
    <groupId>com.squareup.okhttp3</groupId>
    <artifactId>logging-interceptor</artifactId>
    <version>3.14.9</version>
</dependency>

二、yaml配置

# http工具配置
okhttp:
    connect-timeout: 5 #socket连接超时时间(秒)
    read-timeout: 5
    write-timeout: 5
    max-idle-connections: 10 #最大空闲连接数
    keep-alive-duration: 300 #空闲连接最多存活时间(秒)

三、RestTemplate配置

package com.test;

import lombok.extern.slf4j.Slf4j;
import okhttp3.ConnectionPool;
import okhttp3.OkHttpClient;
import org.apache.commons.io.IOUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpRequest;
import org.springframework.http.client.*;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.web.client.RestTemplate;

import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.security.SecureRandom;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * @author shiyunlong
 * @date 2024/3/5  10:59
 */
@Configuration
public class RestTemplateConfig {
    @Value("${okhttp.connect-timeout}")
    private Integer connectTimeout;

    @Value("${okhttp.read-timeout}")
    private Integer readTimeout;

    @Value("${okhttp.write-timeout}")
    private Integer writeTimeout;

    @Value("${okhttp.max-idle-connections}")
    private Integer maxIdleConnections;

    @Value("${okhttp.keep-alive-duration}")
    private Integer keepAliveDuration;


    @Bean("httpRestTemplate")
    public RestTemplate httpRestTemplate() {
        RestTemplate restTemplate = new RestTemplate(httpRequestFactory());
        // 设置消息转换,解决中文乱码问题
        for (HttpMessageConverter<?> converter : restTemplate.getMessageConverters()) {
            // 原有的String是ISO-8859-1编码 ,设置为UTF-8
            if (converter instanceof StringHttpMessageConverter) {
                ((StringHttpMessageConverter) converter).setDefaultCharset(StandardCharsets.UTF_8);
                break;
            }
        }
        // 增加日志拦截器
        List<ClientHttpRequestInterceptor> interceptors = new ArrayList<>();
        interceptors.add(new HttpRequestLogInterceptor());
        restTemplate.setInterceptors(interceptors);
        return restTemplate;
    }

    @Bean("httpsRestTemplate")
    public RestTemplate httpsRestTemplate() {
        RestTemplate restTemplate = new RestTemplate(httpsRequestFactory());
        // 设置消息转换,解决中文乱码问题
        for (HttpMessageConverter<?> converter : restTemplate.getMessageConverters()) {
            // 原有的String是ISO-8859-1编码 ,设置为UTF-8
            if (converter instanceof StringHttpMessageConverter) {
                ((StringHttpMessageConverter) converter).setDefaultCharset(StandardCharsets.UTF_8);
                break;
            }
        }
        // 增加日志拦截器
        List<ClientHttpRequestInterceptor> interceptors = new ArrayList<>();
        interceptors.add(new HttpRequestLogInterceptor());
        restTemplate.setInterceptors(interceptors);
        return restTemplate;
    }

    /**
     * HTTP request factory
     */
    private ClientHttpRequestFactory httpRequestFactory() {
        // 创建连接池
        ConnectionPool connectionPool = new ConnectionPool(maxIdleConnections, keepAliveDuration, TimeUnit.SECONDS);
        // 创建okHttpClient
        OkHttpClient okHttpClient = new OkHttpClient().newBuilder()
                .connectionPool(connectionPool)
                .connectTimeout(connectTimeout, TimeUnit.SECONDS)
                .readTimeout(readTimeout, TimeUnit.SECONDS)
                .writeTimeout(writeTimeout, TimeUnit.SECONDS)
                .hostnameVerifier((hostname, sslSession) -> true)
                .retryOnConnectionFailure(true)
                // 设置代理
//              .proxy(new Proxy(Proxy.Type.HTTP, new InetSocketAddress("127.0.0.1", 8888)))
                // 拦截器
//                .addInterceptor()
                .build();
        // 返回ClientHttpRequestFactory
        return new OkHttp3ClientHttpRequestFactory(okHttpClient);
    }

    /**
     * HTTPS request factory
     */
    private ClientHttpRequestFactory httpsRequestFactory() {
        // 创建连接池
        ConnectionPool connectionPool = new ConnectionPool(maxIdleConnections, keepAliveDuration, TimeUnit.SECONDS);
        // 信任管理
        X509TrustManager trustManager = null;
        SSLContext sslContext = null;
        try {
            trustManager = new X509TrustManager() {
                @Override
                public void checkServerTrusted(X509Certificate[] x509Certificates, String s) {
                }

                @Override
                public void checkClientTrusted(X509Certificate[] x509Certificates, String s) {
                }

                @Override
                public X509Certificate[] getAcceptedIssuers() {
                    return new X509Certificate[0];
                }
            };
            // 信任任何链接
            sslContext = SSLContext.getInstance("TLS");
            sslContext.init(null, new TrustManager[]{trustManager}, new SecureRandom());
        } catch (Exception e) {
            e.printStackTrace();
        }
        // 创建okHttpClient
        OkHttpClient okHttpClient = new OkHttpClient().newBuilder()
                .connectionPool(connectionPool)
                .connectTimeout(connectTimeout, TimeUnit.SECONDS)
                .readTimeout(readTimeout, TimeUnit.SECONDS)
                .writeTimeout(writeTimeout, TimeUnit.SECONDS)
                .hostnameVerifier((hostname, sslSession) -> true)
                .sslSocketFactory(sslContext.getSocketFactory(), trustManager)
                .retryOnConnectionFailure(true)
                // 设置代理
//              .proxy(new Proxy(Proxy.Type.HTTP, new InetSocketAddress("127.0.0.1", 8888)))
                // 拦截器
//                .addInterceptor()
                .build();
        // 返回ClientHttpRequestFactory
        return new OkHttp3ClientHttpRequestFactory(okHttpClient);
    }


    @Slf4j
    static class HttpRequestLogInterceptor implements ClientHttpRequestInterceptor {
        /*
        也可以使用okhttp预置的日志拦截器,放在OkHttpClient的拦截器集合里
        <!--添加日志拦截器-->
        <dependency>
            <groupId>com.squareup.okhttp3</groupId>
            <artifactId>logging-interceptor</artifactId>
            <version>3.14.9</version>
        </dependency>
        // 日志拦截器
        HttpLoggingInterceptor logInterceptor = new HttpLoggingInterceptor();
        logInterceptor.setLevel(HttpLoggingInterceptor.Level.BASIC);
        */

        @Override
        public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
            requestLog(request, body);
            ClientHttpResponse response = execution.execute(request, body);
            responseLog(response);
            return response;
        }

        private void requestLog(HttpRequest request, byte[] body) {
            log.info("==================== request start ====================");
            log.info("Uri         :{}", request.getURI());
            log.info("Method      :{}", request.getMethod());
            log.info("Headers     :{}", request.getHeaders());
            log.info("Request Body:{}", new String(body, StandardCharsets.UTF_8));
            log.info("==================== request end ====================");
        }

        private void responseLog(ClientHttpResponse response) throws IOException {
            log.info("==================== response start ====================");
            log.info("Status Code  :{}", response.getStatusCode());
            log.info("Status Text  :{}", response.getStatusText());
            log.info("Headers      :{}", response.getHeaders());
            log.info("Response Body:{}", IOUtils.toString(response.getBody(), StandardCharsets.UTF_8));
            log.info("==================== response end ====================");
        }
    }
}

四、封装httpUtils

五、配置详解-更多设置项

标签:info,log,request,RestTemplate,OkHttp3,整合,import,new,response
From: https://www.cnblogs.com/hellosyl/p/18054333

相关文章

  • 使用xml文件配置SSM整合
    使用XML文件配置SSM整合。缺点:xml解析低,降低项目响应效率。配置web.xml<?xmlversion="1.0"encoding="UTF-8"?><web-appxmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLoc......
  • Redis整合Springboot
    六.巅峰1.事务Redis单条命令保证原子性,但是事务不保证原子性原子性:要么同时成功,要么同时失败Redis的事物本质:一组命令的集合,一个事务中的所有命令都会被序列化,事务执行过程中,会按照顺序执行。具有一次性,顺序性,排他性(没有隔离级别的概念)所有的命令在事务中,并没有直接执行,只有......
  • SSM整合之使用配置类替换xml配置文件(2)
    SSM整合就是将MVC三层架构和框架核心API组件交给SpringIoC容器管理!一般需要配置两个IoC容器进行三层架构组件管理。容器名盛放组件web容器web相关组件(controller,springmvc核心组件)root容器业务和持久层相关组件(service,aop,tx,dataSource,mybatis,mapper等)w......
  • Spring Boot整合RabbitMQ
    目录简述自定义消息转换器rabbitmq配置说明生产者重连生产者确认机制Return机制Confirm机制小结消费者确认机制消费者失败重试机制失败消息处理策略RabbitMQ整合引入spring-boot-starter-amqp依赖application.yml配置启动类添加启动注解MQ配置(队列、交换机声明)动态创建队列与交......
  • Spring Boot整合邮件发送
    整合邮件发送功能SpringBoot2.x集成了mail模块在pom.xml中引入依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId></dependency>邮箱配置一些必要的名词解释什么是POP3、SMTP和IMAP?他们是三......
  • spring-boot整合jsp + mybatis ems小案例分析
    1.项目开发流程 需求分析:分析用户主要需求提取出项目核心功能根据核心功能构建页面原型 库表设计(概要设计):1.分析整个系统有哪些表2.分析出表之间关联关系3.确定字段 详细设计(流程图,伪代码):用来验证库表准确性 功能实现(编码):环境搭建具体功能实现 功能测试......
  • 【Spring Framework】IoC容器、依赖注入 + 基于XML && 基于注解 && 基于Java Config配
    概念IoC,InversionofControl,控制反转:将对象的控制权交由第三方统一管理DI,DependencyInjection:依赖注入,使用反射技术,是一种IoC的实现SpringIoC容器:用于统一创建与管理对象依赖XML管理对象(bean):applicationContext.xmlSpring框架使用流程-基于XML配置IoC容器1.导入spring......
  • Spring系列之(六)Spring整合Junit
    Spring整合Junit上面部分的内容是把8.3.7节的第一个问题给解决了,我们来看第二个问题(测试代码开发和测试部分耦合度高,图中标红部分一般测试人员无法完成)pom中导入Spring整合Junit的坐标使用Junit提供的@RunWith注解把Junit原有的main方法替换成Spring提供的main方法告知Sprin......
  • springCloud整合seata
    Seata作为分布式事务解决方案,致力于提供高性能简单易用的分布式服务。Seata提供了AT、TCC、SAGA、XA事务模式,此处介绍的是AT模式。传统的单体应用中,通常本地数据库(@Transactional)保证一致性和完整性,而分布式环境中,多个服务进行跨数据库操作,此时本地事务无法保证全局事务一致性,这......
  • springBoot 整合 groovy 实现表达式解析 该示例可以用于配置告警规则
    1.引入pom<dependency><groupId>org.codehaus.groovy</groupId><artifactId>groovy</artifactId><version>3.0.9</version></dependency><dependency......