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@Primarypublic OkRestClient okRestClient(OkRestClient okRestClient) {return new OkRestClient(okRestClient);}@Beanpublic 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();}@Beanpublic 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();}@Beanpublic 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;}}@Beanpublic 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];}};}@Beanpublic ConnectionPool pool() {return new ConnectionPool(this.maxIdleConnections, this.keepAliveDuration, TimeUnit.SECONDS);}
}

使用 OkHttp

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

使用OkHttp 时 只需要注入 @AutoWired OkRestClient okRestClient; 即可

Spring boot 使用 Okhttp3相关推荐

  1. 安卓后端mysql_后端Spring Boot+前端Android交互+MySQL增删查改(Java+Kotlin实现)

    1 前言&概述 这篇文章是基于这篇文章的更新,主要是更新了一些技术栈以及开发工具的版本,还有修复了一些Bug. 本文是SpringBoot+Android+MySQL的增删查改的简单实现,用到 ...

  2. 使用spring boot+shiro+jwt+mybatis-plus搭建项目框架

    1.创建spring boot项目,并导入依赖 pom.xml <dependencies><dependency><groupId>org.springframe ...

  3. Spring Boot(13)——使用RestTemplate

    使用RestTemplate RestTemplate是Spring Web模块提供的作为客户端按照Rest规范进行Http请求的工具.Spring Boot也提供了对它的自动配置,Spring Bo ...

  4. 基于Spring Boot 2.5.1 微服务框架发布(Eurynome Cloud )

    企业级技术中台微服务架构与服务能力开发平台(Eurynome Cloud ) Eurynome Cloud是一款企业级技术中台微服务架构与服务能力开发平台.基于Spring Boot 2.5.1.Sp ...

  5. 测开工具:spring boot 实现mock平台

    目录 一.实现功能 1.使用spring boot 实现mock平台 2.返回结果数据的存放: 3.如何根据url返回对应的结果? 1.3.1  将请求的URI拼成返回结果的文件/文件夹路径 1.3. ...

  6. Spring boot+ JavaFx实现进销存系统

    准备写一个简单的进销存软件,记录一下遇到的问题的和每天的工作. 初步的想法是用Spring Boot搭建后端,MyBatis进行数据库操作:软件运行在Windows上,使用JavaFx来进行图形界面编 ...

  7. Spring Boot 使用七牛云存储图片并且使用自定义域名访问

    文章目录 前言 一.环境准备 1. 账号准备 注册七牛云账号并实名 创建对象存储空间 获取密钥 2. 创建spring boot 项目 pom.xml application.yml 二.上传本地文件 ...

  8. spring boot项目 中止运行 最常用的几种方法

    spring boot项目 中止运行 最常用的几种方法: 1. 调用接口,停止应用上下文 @RestController public class ShutdownController impleme ...

  9. html+spring boot简单的ajax数据传输实现

    本篇讲解在前后端不分离情况下的html+spring boot的项目数据传输实现 首先,后台我写了三个接口 package com.demo.ajax.controller;import com.de ...

最新文章

  1. 一个httpwebrequest异步下载的例子
  2. 解决PhpStorm卡顿的问题
  3. 【转】贴片电阻的工作寿命
  4. linux如何查tomcat是否安装,如何检测linux机器上是否安装了tomcat和ant
  5. ThinkPHP5下自己写日志
  6. R7-2 试试多线程 (10 分)
  7. qtp12版本下载安装破解教程
  8. carbon安装win7 thinkpad x1_联想thinkpad x1 carbon 2017笔记本使用u启动u盘安装win7系统教程...
  9. 任务型对话(一)—— NLU/SLU(意识识别和槽值填充)
  10. linux创建软连接记录
  11. Google docs支持上传任何文档包括pdf...Cool!
  12. jQuery库简介及下载引入
  13. 软件工程毕业设计 毕设课题选题题目汇总
  14. Android开发环境配置
  15. 关于机器学习模型的评估方法
  16. 手机连Fiddler后,仍然不能上网的解决办法
  17. 计算机中插入背景图片怎样操作,word插入背景图片_Word 2007中插入图片的背景设置妙招_word中插入背景图片_word插入图片做背景...
  18. [详细过程] | 使用tokenizers训练wordpiece模型
  19. Oracle查询某一天数据的SQL语句的几种写法
  20. ps教程:用PS和FLASH8做眨眼教材

热门文章

  1. 百度CarLife开发备忘
  2. Mac下修改git用户名,邮箱
  3. Web方向学习路线(信息安全)
  4. Window10系统卸载软件时,系统显示windows找不到文件,请确定文件名是否正确后再试一次?
  5. COPU陆首群教授应邀在开放原子全球开源峰会上做主旨演讲
  6. 如何修复UITextField在iOS10文字下沉问题
  7. win10中卸载了ie浏览器重新安装后不能打开的问题
  8. java实现 IP/掩码位 转换 ip段范围
  9. 7-116 十六进制数转换成相应的十进制数 (15分)
  10. CSS选择器 优先级