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@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相关推荐
- 安卓后端mysql_后端Spring Boot+前端Android交互+MySQL增删查改(Java+Kotlin实现)
1 前言&概述 这篇文章是基于这篇文章的更新,主要是更新了一些技术栈以及开发工具的版本,还有修复了一些Bug. 本文是SpringBoot+Android+MySQL的增删查改的简单实现,用到 ...
- 使用spring boot+shiro+jwt+mybatis-plus搭建项目框架
1.创建spring boot项目,并导入依赖 pom.xml <dependencies><dependency><groupId>org.springframe ...
- Spring Boot(13)——使用RestTemplate
使用RestTemplate RestTemplate是Spring Web模块提供的作为客户端按照Rest规范进行Http请求的工具.Spring Boot也提供了对它的自动配置,Spring Bo ...
- 基于Spring Boot 2.5.1 微服务框架发布(Eurynome Cloud )
企业级技术中台微服务架构与服务能力开发平台(Eurynome Cloud ) Eurynome Cloud是一款企业级技术中台微服务架构与服务能力开发平台.基于Spring Boot 2.5.1.Sp ...
- 测开工具:spring boot 实现mock平台
目录 一.实现功能 1.使用spring boot 实现mock平台 2.返回结果数据的存放: 3.如何根据url返回对应的结果? 1.3.1 将请求的URI拼成返回结果的文件/文件夹路径 1.3. ...
- Spring boot+ JavaFx实现进销存系统
准备写一个简单的进销存软件,记录一下遇到的问题的和每天的工作. 初步的想法是用Spring Boot搭建后端,MyBatis进行数据库操作:软件运行在Windows上,使用JavaFx来进行图形界面编 ...
- Spring Boot 使用七牛云存储图片并且使用自定义域名访问
文章目录 前言 一.环境准备 1. 账号准备 注册七牛云账号并实名 创建对象存储空间 获取密钥 2. 创建spring boot 项目 pom.xml application.yml 二.上传本地文件 ...
- spring boot项目 中止运行 最常用的几种方法
spring boot项目 中止运行 最常用的几种方法: 1. 调用接口,停止应用上下文 @RestController public class ShutdownController impleme ...
- html+spring boot简单的ajax数据传输实现
本篇讲解在前后端不分离情况下的html+spring boot的项目数据传输实现 首先,后台我写了三个接口 package com.demo.ajax.controller;import com.de ...
最新文章
- 一个httpwebrequest异步下载的例子
- 解决PhpStorm卡顿的问题
- 【转】贴片电阻的工作寿命
- linux如何查tomcat是否安装,如何检测linux机器上是否安装了tomcat和ant
- ThinkPHP5下自己写日志
- R7-2 试试多线程 (10 分)
- qtp12版本下载安装破解教程
- carbon安装win7 thinkpad x1_联想thinkpad x1 carbon 2017笔记本使用u启动u盘安装win7系统教程...
- 任务型对话(一)—— NLU/SLU(意识识别和槽值填充)
- linux创建软连接记录
- Google docs支持上传任何文档包括pdf...Cool!
- jQuery库简介及下载引入
- 软件工程毕业设计 毕设课题选题题目汇总
- Android开发环境配置
- 关于机器学习模型的评估方法
- 手机连Fiddler后,仍然不能上网的解决办法
- 计算机中插入背景图片怎样操作,word插入背景图片_Word 2007中插入图片的背景设置妙招_word中插入背景图片_word插入图片做背景...
- [详细过程] | 使用tokenizers训练wordpiece模型
- Oracle查询某一天数据的SQL语句的几种写法
- ps教程:用PS和FLASH8做眨眼教材