Spring boot 使用 Okhttp3

这篇具有很好参考价值的文章主要介绍了Spring boot 使用 Okhttp3。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Spring boot 集成 okhttp3, 使用 http,https 在项目调用第三方服务是在所难免的,运用传统类型的Http调用,封装繁琐,代码量多还不简洁,避免一次一次的 找 度娘, 小记一下。

引入jar

<dependency>
    <groupId>com.squareup.okhttp3</groupId>
    <artifactId>okhttp</artifactId>
    <version>4.10.0</version>
</dependency>

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
</dependency>

OkRestClient 工具类

piublic class OkRestClient {
    private static final Logger log = LoggerFactory.getLogger(OkRestClient.class);
    private static final MediaType JSON = MediaType.parse("application/json; charset=utf-8");
    private static final MediaType XML = MediaType.parse("application/xml; charset=utf-8");
    private OkHttpClient okHttpClient;

    public OkRestClient(OkHttpClient okHttpClient) {
        this.okHttpClient = okHttpClient;
    }

    public String doGet(String url) {
        return this.doGet(url, (Map)null, (Map)null);
    }

    public String doGetParams(String url, Map<String, String> params) {
        return this.doGet(url, params, (Map)null);
    }

    public String doGetHeaders(String url, Map<String, String> headers) {
        return this.doGet(url, (Map)null, headers);
    }

    public String doGet(String url, Map<String, String> params, Map<String, String> headers) {
        StringBuilder sb = new StringBuilder(url);
        if(params != null && params.keySet().size() > 0) {
            boolean firstFlag = true;
            Iterator _params = params.keySet().iterator();
            while(_params.hasNect()) {
                String key = (String)_params.next();
                if(firstFlag) {
                    sb.append("?").append(key).append("=").append((String)params.get(key));
                    firstFlag = false;
                } else {
                    sb.append("&").append(key).append("=").append((String)params.get(key));
                }
            }
        }

        Builder builder = new Builder();
        if(headers != null) {
            headers.forEach((k, v) -> {
                builder.addHeader(k, v);
            });
        }

        Request request = builder.url(sb.toString()).build();
        log.info("do get request and url [{}]", sb.toString());
        return this.execute(request);
    }

     public String doPost(String url, Map<String, String> params, Map<String, String> headers) {
        okhttp3.FormBody.Builder formBodyBuilder = new okhttp3.FormBody.Builder();
        if(params != null && params.keySet().size() > 0) {
            Iterator _params = params.keySet().iterator();
            while(_params.hasNect()) {
                String key = (String)_params.next();
                formBodyBuilder.add(key, (String)params.get(key))
            }
        }

        Builder builder = new Builder();
        if(headers != null) {
            headers.forEach((k, v) -> {
                builder.addHeader(k, v);
            });
        }

        Request request = builder.url(url).post(formBodyBuilder.builder()).build();
        log.info("do post request and url [{}]", url);
        return this.execute(request);
     }

    public String doPostJson(String url, String json, Map<String, String> headers) {
        log.info("do post request and url [{}]", url);
        return this.executePost(url, json, JSON, headers);
    }

    public String doPostXml(String url, String xml, Map<String, String> headers) {
        log.info("do post request and url [{}]", url);
        return this.executePost(url, xml, XML, headers);
    }

    public String executePost(String url, String data, MediaType contentType, Map<String, String> headers) {
        RequestBody requestBody = RequestBody.create(contentType, data);
        Builder builder = new Builder();
        if(headers != null) {
            Objects.requireNonNull(builder);
            headers.dorEach(builder::addHeader);
        }
        Request request = builder.url(url).post(requestBody).build();
        return this.execute(request);   
    }

    private String execute(Request request) {
        Response response = null;

        String result;
        try {
            response = this.okHttpClient.newCall(request).execute();
            if(!response.isSuccessFul()) {
                return "";
            }
            result = ((ResponseBody)Objects.requireNonNull(response.body())).toString();
        } catch(Exception e) {
            log.error(ExecptionUtils.getStackTrace(e));
            return "";
        } finally {
            if(response != null) {
                response.close();
            }
        }
        return result;
    }

    public InputStream getFile(String url, Map<String, String> params, Map<String, String> headers) {
        StringBuilder sb = new StringBuilder(url);
        if(params != null && params.keySet().size() > 0) {
            boolean firstFlag = true;
            Iterator _params = params.keySet().iterator();
            while(_params.hasNect()) {
                String key = (String)_params.next();
                if(firstFlag) {
                    sb.append("?").append(key).append("=").append((String)params.get(key));
                    firstFlag = false;
                } else {
                    sb.append("&").append(key).append("=").append((String)params.get(key));
                }
            }
        }

        Builder builder = new Builder();
        if(headers != null) {
            headers.forEach((k, v) -> {
                builder.addHeader(k, v);
            });
        }

        Request request = builder.url(sb.toString()).build();
        log.info("do get request and url [{}]", sb.toString());
        return this.executeFile(request);
    }

    private InputStream executeFile(Request request) {
        Response response = null;

        InputStream result;
        try {
            response = this.okHttpClient.newCall(request).execute();
            if(!response.isSuccessFul()) {
                return null;
            }
            result = (InputStream)Objects.requireNonNull(response.body().byteStream());
        } catch(Exception e) {
            log.error(ExecptionUtils.getStackTrace(e));
            return null;
        } finally {
            if(response != null) {
                response.close();
            }
        }
        return result;
    }

}

OkHttp动态配置

@ConfitionalOnProperty(prifix = "ok", name = {"enable"}, havingValue = "true", matchIfMissing = false)
@Configuration
public class OkHttpConfiguration {
    @Value("${ok.http.write-timeout:5}")
    private Integer writeTimeout;
    @Value("${ok.http.max-idle-connections:50}")
    private Integer maxIdleConnections;
    @Value("${ok.http.keep-alive-duration:50}")
    private Long keepAliveDuration;
    @Value("${ok.http.connect-timeout:5}")
    private Integer connectTimeout;
    @Value("${ok.http.read-timeout:5}")
    private Integer readTimeout;
    @Value("${ok.http.call-timeout:5}")
    private Integer callTimeout;
    @Value("${ok.http.write-timeout:15}")
    private Integer writeTimeout;
    @Value("${ok.proxy.enable:false}")
    private boolean proxyEnable;
    @Value("${ok.proxy.host}")
    private String proxyHost;
    @Value("${ok.proxy.port}")
    private String proxyPort;


    @Bean
    @Primary
    public OkRestClient okRestClient(OkRestClient okRestClient) {
        return new OkRestClient(okRestClient);
    }

    @Bean
    public OkHttpClient okHttpClient () {
        Builder builder = (new Builder()).sslSocketFactory(this.sslSocketFactory(), this.x509TrustManager()).retryOnConnectionFailure(false).connectionPool(this.pool()).connectTimout((long)this.connectTimeout, TimeUnit.SECONDS).readTimeout((long)this.readTimeout, TimeUnit.SECONDS).writeTimeout((long)this.writeTimeout, TimeUnit.SECONDS).callTimeout((long)this.callTimeout, TimeUnit.SECONDS).hostnameVerifier((hostname, session) -> {
            return true;
        });
        if(this.proxyEnable) {
            builder.proxy(new Proxy(Type.HTTP, new InetSocketAddress(this.proxyHost, this.proxyPort)));
        }
        return builder.build();
    }

    @Bean
    public OkHttpClient okHttpClientNoProxy(ConnectionPool pool, SslSocketFactory sslSocketFactory, X509TrustManager x509TrustManager) {
        return new OkHttpClient((new Builder()).sslSocketFactory(sslSocketFactory, x509TrustManager).retryOnConnectionFailure(false).connectionPool(pool).connectTimout((long)this.connectTimeout, TimeUnit.SECONDS).readTimeout((long)this.readTimeout, TimeUnit.SECONDS).writeTimeout((long)this.writeTimeout, TimeUnit.SECONDS).callTimeout((long)this.callTimeout, TimeUnit.SECONDS).hostnameVerifier((hostname, session) -> {
            return true;
        }).build();
    }


    @Bean
    public SslSocketFactory sslSocketFactory() {
        try {
            SSLContext sslContext = SSLContext.getInstance("TLS");
            sslContext.init((KeyManager[])null, new TrustManager[]{this.x509TrustManager()}, new SecureRandom());
            return sslContext.getSocjetFactory();
        } catch (KeyManagementException | NoSuchAlgorithmException e) {
            e.printStackTrace();
            return null;
        }
    }


    @Bean
    public X509TrustManager x509TrustManager() {
        return new X509TrustManager() {
            public void checkClientTrusted(X509Certificate[] chain, String authType) throws certificateException{}
            public void checkServerTrusted(X509Certificate[] chain, String authType) throws certificateException{}
            public X509Certificate[] getAcceptedIssuers(){
                return new X509Certificate[0];
            }
        };
    }

    @Bean
    public ConnectionPool pool() {
        return new ConnectionPool(this.maxIdleConnections, this.keepAliveDuration, TimeUnit.SECONDS);
    }
}

使用 OkHttp

ok:
  # 启用okHttp
  enable: true
  proxy:
    enable: false     # true 将启用代理
    host: 192.168.1.1 # 代理服务器地址
    port: 8888        # 代理服务器端口
  http:
    connect-timeout: 10         # 三次握手 + SSL建立耗时 10s
    read-timeout: 5             # 连接建立后,从远端获取数据,TCP 传输 5s
    write-timeout: 5            # 连接建立后,向远端发送数据,TCP 传输 5s
    call-timeout: 20            # 从发起到结束的总时长,其中不包括 UnknowsHostException 情况 30s
    max-idle-connections: 50    # 连接池中整体的空闲连接最大数量
    keep-alive-duration: 50     # 连接空闲时间最多为 50s

使用OkHttp 时 只需要注入 @AutoWired OkRestClient okRestClient; 即可文章来源地址https://www.toymoban.com/news/detail-514809.html

到了这里,关于Spring boot 使用 Okhttp3的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java之okhttp3请求方式

    在java开发中,发起http请求是非常常见的需求,常用的有HttpClient,下面聊一下okhttp3的请求方式。 1、引入okhttp3依赖 2、提供springboot工程及http接口 3、http请求 4、请求结果 get请求 post请求 form表单请求 可见发起http请求还是挺方便的,感兴趣的小伙伴可以试试~~~///( v )~~~

    2024年02月13日
    浏览(32)
  • Android Okhttp3 分发器源码解析

    在 OkHttp 中,分发器(Dispatcher)是负责调度和执行网络请求的组件。它 管理 着 并发 的 请求数量 以及请求的 优先级 ,确保合理地使用底层的连接池和线程池,从而 提高 网络请求的 效率 和 性能 。 默认情况下,OkHttp 使用一个单例的分发器,它可以处理同时进行的最大请求

    2024年02月12日
    浏览(37)
  • com.squareup.okhttp3:okhttp 组件安全漏洞及健康度分析

    维护者 square组织 许可证类型 Apache License 2.0 首次发布 2016 年 1 月 2 日 最新发布时间 2023 年 4 月 23 日 GitHub Star 44403 GitHub Fork 9197 依赖包 5,582 依赖存储库 77,217 com.squareup.okhttp3:okhttp 一个开源的 HTTP 客户端库,可以用于 Android 和 Java 应用程序。它提供了一种简单而强大的方式来发

    2024年02月10日
    浏览(17)
  • Android okhttp3.0配置https信任所有证书

    参考: Android okhttp3.0配置https的自签证书和信任所有证书

    2024年02月19日
    浏览(31)
  • Spring Boot OkHttp

    1、pom.xml 添加依赖 2、OkHttpController.java * * *

    2024年02月16日
    浏览(28)
  • Android Okhttp3添加https自签名证书以及Glide4

    没有得到安卓认可的证书颁发机构颁发的证书. 自己颁发的证书, 分临时性的(在开发阶段使用)或在发布的产品中永久性使用的两种. 而只有Android系统认可的机构办法的证书,在使用过程中才不会出现安全提示。 为什么会有人使用自签名的证书呢? (重要的事重复三遍)免费

    2024年04月16日
    浏览(67)
  • 在Java版的OkHttp3 中 RequestBody.create() 过时解决方案

    当使用下面的代码时会提示 RequestBody.create() 已过时。 如下图: 解决办法: 如下图:

    2024年02月16日
    浏览(30)
  • Spring Boot进阶(75):从容应对HTTP请求——Spring Boot与OkHttp完美结合

            在现代的Web应用程序中,HTTP请求成为了构建客户端和服务器端之间通信的一个重要手段。Spring Boot是一个灵活的Web框架,它提供了与HTTP请求相关的许多特性和API。OkHttp是一个流行的HTTP客户端库,它提供了面向对象的API,以便开发人员轻松地在其应用中进行HTTP请求

    2024年02月06日
    浏览(33)
  • 使用 Spring Boot 集成 Nacos

    在本篇博客中,我们将介绍如何使用 Spring Boot 框架来集成 Nacos,实现服务的注册与发现。Nacos 是一个开源的动态服务发现、配置和服务管理平台,能够帮助我们构建和管理微服务架构。 在开始之前,确保你已经安装了以下软件和工具: Java JDK 8 或以上版本 Maven 构建工具 Sp

    2024年02月10日
    浏览(36)
  • Spring Boot 集成和使用 Liquibase

    部署到生产环境中的所有应用程序都应使用自动化方法迁移数据库。为了从繁琐的DDL书写中解放出来,减少人工操作引入的BUG,我们需要借助工具完成数据库迁移工作。FlyWay或Liquibase就是两个用起来比较舒服的工具。 本文将介绍 Liquibase 在 Spring Boot 中的引入和使用。阅读本文

    2024年02月09日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包