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客户端相关推荐

  1. python同花顺交易_THSTrader - 量化交易。最新版通用版同花顺客户端的python API。(Python3)...

    THSTrader - 量化交易.最新版通用版同花顺客户端的python API.(Python3) 419 稳定性测试中..... https://github.com/nladuo/THSTrad ...

  2. VS 中配置使用Visual SVN系列 三:TortoiseSVN Client(客户端)下载和安装

    VS 中配置使用Visual SVN系列 三:TortoiseSVN Client(客户端)下载和安装 1.TortoiseSVN Client(客户端)下载 https://www.visualsv ...

  3. oracle装了客户端怎么登陆账号,分享Oracle 11G Client 客户端安装步骤(图文详解)...

    Oracle 11G Client 客户端安装步骤,具体如下: 下载地址:http://www.gimoo.net/database/167737.html 先将下载下来的ZIP文件解压,并运行set ...

  4. 【springboot进阶】RestTemplate 集成 okhttp3 请求带p12证书

    目录 一.创建微信支付rest模板配置类 1.创建http请求工厂 2.实例化 RestTemplate 模板对象 二.封装微信支付相关的公共请求类 三.关于扩展 1.创建证书请求工厂方法 2.请求工 ...

  5. 迅捷fw150服务器无响应,Fast迅捷FW150RM无线路由器Client客户端模式怎么设置

    Fast迅捷FW150RM无线路由器配置简单,不过对于没有网络基础的用户来说,完成路由器的安装和Client客户端模式的设置,仍然有一定的困难,本文学习啦小编主要介绍Fast迅捷FW150RM无线路由 ...

  6. Hadoop第四章:Client客户端2.0

    系列文章目录 系列文章目录 Hadoop第一章:环境搭建 Hadoop第二章:集群搭建(上) Hadoop第二章:集群搭建(中) Hadoop第二章:集群搭建(下) Hadoop第三章:Shell命令 ...

  7. 在Linux操作系统内安装PacketiX ××× Client (客户端)的步骤

    在Linux操作系统内安装PacketiX ××× Client (客户端)的步骤 进入虚拟机linux5红帽版后,进行如下操作: 点击右键,选择"打开终端"进入命令行操作 进入命 ...

  8. Squirrel SQL Client客户端工具

    Squirrel SQL Client客户端工具 SQuirrel SQL Client是一个用Java编写的开源数据库工具,可以用来查看/编辑数据库的内容.发出SQL 命令.它可以支持兼容JDBC的 ...

  9. 最新版通用版同花顺客户端的python API

    python 同花顺thstrader_GitHub - hooddonkey/THSTrader: 量化交易..(Python3)... THSTrader 量化交易.通用版同花顺客户端的pytho ...

最新文章

  1. 实践微服务六年,我获得了这些心得体会
  2. Git学习笔记——一个NB的分布式版本控制系统
  3. 第二讲 Best Practices For Running IIS 6.0 And ASP.NET
  4. 20172325 2018-2019-1 《Java程序设计》第二周学习总结
  5. rust语法丑陋_抛出异常–缓慢而丑陋
  6. MTK优美代码赏析6:电话本里的快速排序和插入排序算法
  7. 一张纸厚度是多少毫米_大洼20毫米水泥纤维板多少钱一张追求至善
  8. Thinapp的昨天,今天和明天
  9. matlab库函数大全
  10. SpringBoot 整合 liquibase
  11. 苍井空老师的Twitter
  12. rainmeter雨滴皮肤——万花筒
  13. 动能方案|RFID动物耳标解决方案
  14. 鸿蒙申请邮箱格式是什么,手机邮箱格式怎么写
  15. 光刻厚胶 Thick Resist(SU-8 GM10xx,SU-8 Microchem,SPR220,NR26-25000P)
  16. 北京航空航天大学计算机学院系主任,北京航空航天大学计算机学院王蕴红教授访问我中心...
  17. 在原有产品的基础上建立软件产品线的方式
  18. UnityShader入门精要-屏幕后处理效果 亮度饱和度对比度、边缘检测、高斯模糊、bloom效果、运动模糊
  19. 2021 国内外 IoT 物联网平台汇总
  20. ORA-01034: ORACLE not available Process ID: 0 Session ID: 0 Serial number: 0

热门文章

  1. openresty 配置模块化
  2. 手机开机启动慢是什么原因_电脑启动慢是什么原因
  3. tailwindcss 一览表
  4. Java小白的学习之路——day03
  5. HTML表单及表单控件
  6. osx shell 辅助利器
  7. html设置p距左侧距离,P标签段落距离如何设置?
  8. Java输入语句使用方法
  9. 比亚迪创始人王传福:找准方向,然后不顾一切
  10. iPhone恢复android上的app,如何恢复iPhone和Android上删除的WhatsApp消息