RestTemplate结合OkHttp3通用Rest Client客户端
RestTemplate结合OkHttp3通用Rest Client客户端
文章目录
- RestTemplate结合OkHttp3通用Rest Client客户端
- 一、OkHttp3 Authenticator认证器(仅支持http响应码401和407)
- 二、RestTemplate basicAuthentication
- 三、RestTemplate集成OkHttpClient
- 1.集成OkHttp3
- 2.自定义OkHttpClient拦截器
- 3.自定义RestTemplate拦截器
- 4.集合Spring RetryTemplate框架自动重试
一、OkHttp3 Authenticator认证器(仅支持http响应码401和407)
原理
okhttp3.internal.http.RetryAndFollowUpInterceptor
重试拦截器中,判断http响应码若为{@code 401},则在request请求头附带Basic认证信息
重新发送请求。
package com.example.request.okhttp3;import okhttp3.*;import javax.annotation.Nullable;
import java.io.IOException;/*** <p> 功能描述: Basic 基本认证* 注意:http响应码为{@code 401} 时生效,若目标系统自动重定向到登录页面{@code 302}则无法拦截!* </p>**/
public class BasicAuthenticator implements Authenticator {private String username;private String password;public BasicAuthenticator(String username, String password) {this.username = username;this.password = password;}/*** @see okhttp3.internal.http.RetryAndFollowUpInterceptor** @param route* @param response* @return* @throws IOException*/@Nullable@Overridepublic Request authenticate(@Nullable Route route, Response response) throws IOException {String credential = Credentials.basic(this.username, this.password);return response.request().newBuilder().header("Authorization", credential).build();}}
final OkHttpClient okHttpClient = new OkHttpClient().newBuilder().connectionPool(pool()).connectTimeout(10, TimeUnit.SECONDS).callTimeout(5, TimeUnit.MINUTES).hostnameVerifier((s, sslSession) -> true).authenticator(new BasicAuthenticator("admin","123456")).build();
/*** 连接池** @return 连接池*/public ConnectionPool pool() {return new ConnectionPool(10, 2, TimeUnit.MINUTES);}
二、RestTemplate basicAuthentication
- 方法1
/*** basic认证* {@code RestTemplateBuilder#addClientHttpRequestInitializer(org.springframework.web.client.RestTemplate)}*/restTemplate.getClientHttpRequestInitializers().add(request -> {HttpHeaders headers = request.getHeaders();if (!headers.containsKey(HttpHeaders.AUTHORIZATION)) {headers.setBasicAuth("admin", "123456");}});
- 方法2
final RestTemplate restTemplate = new RestTemplateBuilder().basicAuthentication("admin", "123456").build();
三、RestTemplate集成OkHttpClient
1.集成OkHttp3
RestTemplate restTemplate = new RestTemplate();final HttpMessageConverters converters = SpringUtil.getBean(HttpMessageConverters.class);restTemplate.setMessageConverters(converters.getConverters());// 切换类库OkHttpClient okHttpClient = okHttp3Client();restTemplate.setRequestFactory(new OkHttp3ClientHttpRequestFactory(okHttpClient));
/*** okHttp3Client 客户端* {@code https://square.github.io/okhttp/}** @return httpClient*/public OkHttpClient okHttp3Client() {return new OkHttpClient().newBuilder().connectionPool(pool()).connectTimeout(10, TimeUnit.SECONDS).callTimeout(5, TimeUnit.MINUTES).hostnameVerifier((s, sslSession) -> true)// 禁止重定向.followRedirects(false).build();}/*** 连接池** @return 连接池*/public ConnectionPool pool() {return new ConnectionPool(10, 2, TimeUnit.MINUTES);}
2.自定义OkHttpClient拦截器
okhttp3.Interceptor
public OkHttpClient okHttp3Client() {return new OkHttpClient().newBuilder().addInterceptor(chain -> {Request request = chain.request();Response response = chain.proceed(request);if (!response.isSuccessful()) {// 静默关闭closeQuietly(response.body());response = chain.proceed(request);}return response;}).build();}
3.自定义RestTemplate拦截器
RestTemplate restTemplate = new RestTemplate();
restTemplate.getInterceptors().add((request, body, execution) -> {ClientHttpResponse clientHttpResponse = execution.execute(request, body);if (clientHttpResponse.getStatusCode().is5xxServerError()) {clientHttpResponse = execution.execute(request, body);}return clientHttpResponse;});
4.集合Spring RetryTemplate框架自动重试
RestTemplate用法-基本认证、JWT Token认证、自动重试
- pom.xml
<dependency><groupId>org.springframework.retry</groupId><artifactId>spring-retry</artifactId><version>1.3.1</version></dependency>
- 重试代码实现
/*** 结合RetryTemplate重试框架(编程式方式)* RetryTemplate重试框声明式注解方式:依赖{@code spring-boot-starter-aop }且重试类必须注入为spring bean* @param builder* @return*/@Beanpublic RestTemplate restTemplate(RestTemplateBuilder builder) {return builder.setConnectTimeout(Duration.ofSeconds(10)).setReadTimeout(Duration.ofSeconds(120)).additionalInterceptors((request, body, execution) -> {// RetryTemplate 1.3之后支持链式写法RetryTemplate retryTemplate = RetryTemplate.builder().maxAttempts(10).exponentialBackoff(100, 2, 10000).retryOn(RestClientException.class).build();return retryTemplate.execute(context -> execution.execute(request, body));}).build();}
RestTemplate结合OkHttp3通用Rest Client客户端相关推荐
- python同花顺交易_THSTrader - 量化交易。最新版通用版同花顺客户端的python API。(Python3)...
THSTrader - 量化交易.最新版通用版同花顺客户端的python API.(Python3) 419 稳定性测试中..... https://github.com/nladuo/THSTrad ...
- VS 中配置使用Visual SVN系列 三:TortoiseSVN Client(客户端)下载和安装
VS 中配置使用Visual SVN系列 三:TortoiseSVN Client(客户端)下载和安装 1.TortoiseSVN Client(客户端)下载 https://www.visualsv ...
- oracle装了客户端怎么登陆账号,分享Oracle 11G Client 客户端安装步骤(图文详解)...
Oracle 11G Client 客户端安装步骤,具体如下: 下载地址:http://www.gimoo.net/database/167737.html 先将下载下来的ZIP文件解压,并运行set ...
- 【springboot进阶】RestTemplate 集成 okhttp3 请求带p12证书
目录 一.创建微信支付rest模板配置类 1.创建http请求工厂 2.实例化 RestTemplate 模板对象 二.封装微信支付相关的公共请求类 三.关于扩展 1.创建证书请求工厂方法 2.请求工 ...
- 迅捷fw150服务器无响应,Fast迅捷FW150RM无线路由器Client客户端模式怎么设置
Fast迅捷FW150RM无线路由器配置简单,不过对于没有网络基础的用户来说,完成路由器的安装和Client客户端模式的设置,仍然有一定的困难,本文学习啦小编主要介绍Fast迅捷FW150RM无线路由 ...
- Hadoop第四章:Client客户端2.0
系列文章目录 系列文章目录 Hadoop第一章:环境搭建 Hadoop第二章:集群搭建(上) Hadoop第二章:集群搭建(中) Hadoop第二章:集群搭建(下) Hadoop第三章:Shell命令 ...
- 在Linux操作系统内安装PacketiX ××× Client (客户端)的步骤
在Linux操作系统内安装PacketiX ××× Client (客户端)的步骤 进入虚拟机linux5红帽版后,进行如下操作: 点击右键,选择"打开终端"进入命令行操作 进入命 ...
- Squirrel SQL Client客户端工具
Squirrel SQL Client客户端工具 SQuirrel SQL Client是一个用Java编写的开源数据库工具,可以用来查看/编辑数据库的内容.发出SQL 命令.它可以支持兼容JDBC的 ...
- 最新版通用版同花顺客户端的python API
python 同花顺thstrader_GitHub - hooddonkey/THSTrader: 量化交易..(Python3)... THSTrader 量化交易.通用版同花顺客户端的pytho ...
最新文章
- 实践微服务六年,我获得了这些心得体会
- Git学习笔记——一个NB的分布式版本控制系统
- 第二讲 Best Practices For Running IIS 6.0 And ASP.NET
- 20172325 2018-2019-1 《Java程序设计》第二周学习总结
- rust语法丑陋_抛出异常–缓慢而丑陋
- MTK优美代码赏析6:电话本里的快速排序和插入排序算法
- 一张纸厚度是多少毫米_大洼20毫米水泥纤维板多少钱一张追求至善
- Thinapp的昨天,今天和明天
- matlab库函数大全
- SpringBoot 整合 liquibase
- 苍井空老师的Twitter
- rainmeter雨滴皮肤——万花筒
- 动能方案|RFID动物耳标解决方案
- 鸿蒙申请邮箱格式是什么,手机邮箱格式怎么写
- 光刻厚胶 Thick Resist(SU-8 GM10xx,SU-8 Microchem,SPR220,NR26-25000P)
- 北京航空航天大学计算机学院系主任,北京航空航天大学计算机学院王蕴红教授访问我中心...
- 在原有产品的基础上建立软件产品线的方式
- UnityShader入门精要-屏幕后处理效果 亮度饱和度对比度、边缘检测、高斯模糊、bloom效果、运动模糊
- 2021 国内外 IoT 物联网平台汇总
- ORA-01034: ORACLE not available Process ID: 0 Session ID: 0 Serial number: 0