OkHttp

文章目录

    • OkHttp
        • 概要
          • 1.简介
          • 2.特点
          • 3.基本组成
          • 5.工作流程
        • 拦截器
          • 1.简介
          • 2.内置拦截器
          • 3.自定义拦截器
        • 连接池
          • 1.简介
          • 2.常用参数配置选项
        • Dispatcher和线程池
          • 1.简介
          • 2.重要方法
          • 3.DispatCher中的双端队列
          • 4.总结

OkHttp

概要
1.简介
  • OkHttp是一个开源的HTTP客户端,用于在Java和Android应用程序中发送HTTP请求。
  • 是一个支持 HTTP 和 HTTP/2 的封装的网络请求客户端。
2.特点
  • 高效的连接复用:OkHttp可以复用现有的TCP连接,减少建立和关闭连接的开销,提高性能。
  • 支持HTTP/2:OkHttp支持最新的HTTP/2协议,能够提高传输速度和减少延迟。
  • 灵活的配置:用户可以配置各种请求参数,如超时时间、重定向策略、缓存策略等。
  • 强大的拦截器机制:通过拦截器,可以在请求发送和响应接收的过程中插入自定义逻辑,非常适合进行日志记录、添加认证等操作。
  • 简单的API:OkHttp提供了简单易用的API,使得发送请求和处理响应变得十分方便。
  • 支持同步和异步请求:用户可以选择同步或异步地发送HTTP请求,以适应不同的应用场景。
3.基本组成
  • 请求(Request)和响应(Response)
    OkHttp中的每个请求和响应都封装了HTTP协议的所有必要信息,包括方法(如GET、POST)、URL、头部(Headers)、正文(Body)等。

  • 客户端(Client)
    客户端是OkHttp的核心,负责创建请求、管理连接、执行请求并处理响应。它提供了多种配置选项,如超时时间、重定向策略、协议版本等。

  • 连接管理器(ConnectionPool)
    连接管理器负责维护一个连接池,用于复用TCP连接。这样可以减少建立和关闭连接的次数,提高性能。

  • 拦截器(Interceptor)
    拦截器是一个可以在请求发送到服务器之前和响应从服务器返回之后修改请求或响应的组件。它们通常用于添加认证、日志记录、请求头修改等。

  • 事件日志(EventListener)
    事件日志用于记录请求和响应的生命周期事件,如连接创建、响应接收等。这有助于调试和监控网络活动。
    同步/异步执行:
    OkHttp支持同步和异步执行请求。同步请求会阻塞当前线程直到请求完成,而异步请求则使用回调在后台线程中处理结果。

  • 缓存(Cache)
    OkHttp支持HTTP缓存,可以缓存响应以供后续请求重用,减少网络延迟和数据量传输。

  • 协议解析器(Protocols)
    OkHttp支持多种HTTP协议版本,如HTTP/1.1和HTTP/2。协议解析器负责解析传入的网络数据,并将其转换为可处理的响应对象。

  • SSL/TLS加密
    OkHttp支持通过SSL/TLS对网络连接进行加密,以确保数据传输的安全性。

  • 错误处理
    OkHttp提供了错误处理机制,能够处理网络问题、超时、解析错误等各种异常情况。

    OkHttp 主要是通过 5 个拦截器和 3 个双端队列(2 个异步队列,1 个同步队列)工作。

    内部实现通过一个责任链模式完成,将网络请求的各个阶段封装到各个链条中,实现了各层的解耦。

    底层通过 Socket 发送 HTTP 请求与接受响应,并实现了连接池的概念。

5.工作流程
  • 通过构建者构建出OkHttpClient对象,通过newCall方法获得RealCall请求对象,发起同步或异步请求。

  • 通过Dispatcher对我们所有的RealCall(Call的具体实现类)进行统一管理,处理同步或异步请求。

  • 通过拦截器对请求依次处理,与服务的建立连接后,获取返回数据,再经过上述拦截器依次处理,最后将结果返回给调用方。

    在这里插入图片描述

拦截器
1.简介
  • 允许开发者在请求发送到服务器之前和响应从服务器返回之后对请求或响应进行修改。
  • 五个内置拦截器按顺序组成一个拦截器链,每个拦截器都可以选择处理请求或响应,或者传递给下一个拦截器。
  • 此外,开发者还可以自定义拦截器,插入到这个拦截器链中的适当位置,以便能够处理请求或响应的相应部分。
2.内置拦截器
  • RetryAndFollowUpInterceptor
    这个拦截器负责处理重定向和重新尝试逻辑。如果原始请求因为某些原因(如网络问题)失败了,它会尝试再次发送请求。此外,如果服务器响应了一个重定向,这个拦截器也会处理后续的请求。
  • CacheInterceptor
    缓存拦截器负责处理HTTP缓存。在发送实际的网络请求之前,它会检查本地缓存是否有响应的副本,如果有,则返回缓存版本而不是发起网络请求。同样,当响应被返回时,它会将响应缓存到本地。
  • ConnectInterceptor
    连接拦截器在建立连接时被调用。它负责创建和管理与服务器的TCP连接。如果请求需要建立一个全新的连接,这个拦截器会处理连接的创建。
  • CallServerInterceptor
    这个拦截器是处理实际请求和接收响应的。它将请求发送到服务器,并接收服务器的响应。这是请求生命周期中的最后一个拦截器。
  • BridgeInterceptor
    桥接拦截器位于连接拦截器和调用服务器拦截器之间。它的主要作用是处理一些特殊情况,比如在HTTPS请求中,将原始的HTTP请求转换为HTTPS请求。此外,它还负责在请求中添加一些必要的头信息,如“User-Agent”。
3.自定义拦截器
  • 需要实现InterCeptor接口

    public class MyInterceptor implements Interceptor {
        @Override
        public Response intercept(Chain chain) throws IOException {
            Request originalRequest = chain.request();
            
            // 创建一个新的 Request,可以在这里修改请求信息,例如添加请求头
            Request newRequest = originalRequest.newBuilder()
                    .header("Hello", "A-App")
                    .build();
           
            Response response = chain.proceed(newRequest);
            
            return response;
        }
    }
    
  • 使用时,在OkHttpClient 中配置这个拦截器。想要添加多个拦截器的话,可以将其添加到拦截器链中。

    OkHttpClient client = new OkHttpClient.Builder()
        .addInterceptor(new MyInterceptor())
        .addInterceptor(new AnotherInterceptor())
        .build();
    
连接池
1.简介
  • OkHttp 连接池是 OkHttp 客户端的一部分,它负责管理 HTTP 连接的生命周期,以提高网络请求的效率。

  • 连接池可以重用现有的连接,避免了频繁地创建和销毁连接,从而减少了延迟并节省了资源。

  • OkHttp 默认使用一个简单的连接池,可以通过配置 OkHttpClient 来调整连接池的行为。

2.常用参数配置选项
  • maxIdleConnections(最大连接数):这是连接池中保持空闲的最大连接数。如果连接超过了这个限制,旧连接会被丢弃。
  • connectTimeout(连接超时时间):这是建立连接的超时时间,单位是毫秒。
  • readTimeout(读取超时时间):这是读取数据的超时时间,单位是毫秒。
  • writeTimeout(写入超时时间):这是写入数据的超时时间,单位是毫秒。
  • cleanupThreadInterval(清理间隔):这是连接池清理线程运行的时间间隔,默认为 5 分钟。
Dispatcher和线程池
1.简介
  • Dispatcher中文是分发器的意思,和拦截器不同的是分发器不做事件处理,只做事件流向。
  • 他负责将每一次Requst进行分发,压栈到自己的线程池,并通过调用者自己不同的方式进行异步和同步处理。
  • 确保请求被顺序执行,并且控制着同时执行的请求数量,以避免网络拥塞和资源耗尽。
  • Dispatcher与一个线程池一起工作,这个线程池由固定数量的线程组成。线程池的大小可以通过OkHttpClient的构造函数进行配置。
2.重要方法
  • RealCall.execute

    execute方法同步地发送请求并等待响应, 当调用execute时,当前线程会阻塞,直到收到服务器的响应。
    这个方法适用于简单的请求,或者当你需要直接处理响应(例如,作为同步操作)时。

    将RealCall加入Dispatcher的runningSyncCalls队列。

  • RealCall.enqueue

    enqueue方法异步地发送请求,并将响应的回调放入事件队列中,当调用enqueue时,请求会被发送,但当前线程不会阻塞,可以继续执行其他任务。
    响应的回调会在事件队列中等待处理,通常会在主线程上执行,确保用户界面可以流畅地响应用户交互。

    如果当前正在执行的RealCall的数量小于最大并发数,并且该call对应的Host上的call小于同一host上的最大并发数,则将该call加入runningAsyncCalls,并将这个call放到线程池中进行执行,否则加入readyAsyncCall排队等待。

3.DispatCher中的双端队列
  • readyAsyncCalls:准备运行的异步请求

    异步的缓存,正在准备被消费的(用数组实现,可自动扩容,无大小限制)。

  • runningAsyncCalls:正在运行的异步请求

    正在运行的 异步的任务集合,仅仅是用来引用正在运行的任务以判断并发量,注意它并不是消费者缓存。

  • runningSyncCalls:正在运行的同步请求

    正在运行的,同步的任务集合。仅仅是用来引用正在运行的同步任务以判断并发量。

    OkHttp 设置了默认的最大并发请求量 maxRequests = 64 和单个 Host 主机支持的最大并发量 maxRequestsPerHost = 5

4.总结
  • Dispatcher和线程池在OkHttp中协同工作,确保网络请求被有效、高效地处理。
  • Dispatcher负责请求的调度和管理,而线程池负责实际的网络操作和数据传输。
  • 这种设计既保证了网络请求的有序执行,又避免了资源的过度消耗。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/467957.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Sass】1px分割线 + 缩进分割线

效果图 1. 亮色模式效果 2. 暗色模式效果 设计思路 配色使用grey色 优点:无论在暗色模式还是亮色模式都可以看清楚分割线 使用after,before 伪元素绘制线条,并压缩线条transform: scaleY(.25) 注意事项 必须确保父级有宽高父级定位必须为position: r…

uniapp+vue3+setup语法糖开发微信小程序时不能定义globalData的解决方法

在使用 uniapp 开发小程序的时候, 发现使用了setup 语法糖 ,定义 globalData 时,要不是定义不了, 要不就是使用 getApp()取不到,后来想到一个不伦不类的方法解决了, 这个方法有点难看, 但是解决…

文件读取的高效方法与设计模式

⭐️ 导言 在软件开发中,经常需要处理各种类型的文件,包括文本文件(如JSON、CSV、TXT)、Excel 文件等。针对不同类型的文件,我们需要选择合适的方法来读取和处理文件内容。在本篇博客中,小编以python为例&…

【Windows 常用工具系列 15 -- VMWARE ubuntu 安装教程】

文章目录 安装教程镜像下载 工具安装 安装教程 安装教程参考链接:https://blog.csdn.net/Python_0011/article/details/131619864 https://linux.cn/article-15472-1.html 激活码 VMware 激活码连接:https://www.haozhuangji.com/xtjc/180037874.html…

工控MCGS触摸屏Hacking勒索部署

https://github.com/MartinxMax/Mo0n_V1.2 !!不关注点赞收藏,以后没好东西了奥!! 端口扫描-获取信息 $python Mo0n.py -scan x.x.x.0/24 or $nmap -sS -Pn -T4 x.x.x.0/24 -p 127 MCGS编程软件 发现触摸屏受到密码保护 Oops!!! echo /\_…

基于深度学习YOLOv8+Pyqt5的工地安全帽头盔佩戴检测识别系统(源码+跑通说明文件)

wx供重浩:创享日记 对话框发送:318安全帽 获取完整源码源文件7000张已标注的数据集训练好的模型配置说明文件 可有偿59yuan一对一远程操作配置环境跑通程序 效果展示(图片检测批量检测视频检测摄像头检测) 基于深度学习YOLOv8Pyqt…

【Excel自动化办公】使用openpyxl对Excel进行读写操作

目录 一、环境安装 1.1 创建python项目 1.2 安装openpyxl依赖 二、Excel数据读取操作 三、Excel数据写入操作 3.1 创建空白工作簿 3.2 写数据 四、设置单元格样式 4.1 字体样式 4.2 设置单元格背景填充色 4.3 设置单元格边框样式 4.4 单元格对齐方式 4.5 数据筛选…

B008-springcloud alibaba 短信服务 sms

目录 短信服务介绍短信服务使用准备工作阿里云官网实名认证开通短信服务申请认证秘钥申请短信签名申请短信模板 短信服务API介绍短信发送(SendSms)短信查询(QuerySendDetails)功能测试 下单之后发送短信 短信服务介绍 短信服务(Short Message Service)是…

08-热点文章-定时计算-黑马头条

xxl-Job分布式任务调度 1 今日内容 1.1 需求分析 目前实现的思路:从数据库直接按照发布时间倒序查询 问题1: 如何访问量较大,直接查询数据库,压力较大 问题2: 新发布的文章会展示在前面,并不是热点文章 …

SpringCloud搭建微服务之Micrometer分布式链路追踪

1. 概述 由于Spring Cloud Sleuth最新版本只支持Spring Boot 2.7.x,核心项目已经迁移到Micrometer Traceing项目,Spring Boot 3.x版本要实现分布式链路追踪需要集成Micrometer。更多详情可以参阅Micrometer官网 本文将以Spring Boot 3.2.x和Spring Clo…

Cinema 4D 2024 for mac/Win:开启三维动画与建模新纪元

在数字化时代,三维动画与建模已成为影视、游戏、广告等多个领域不可或缺的创作工具。而Cinema 4D,作为这一领域的佼佼者,始终以其卓越的性能和创新的功能引领着行业的发展。如今,Cinema 4D 2024的发布,更是为我们带来了…

【command not found】原因分析及解决

在使用Linux时,会经常遇到 “command not found” 的错误。错误信息提示的是:Linux没有找到该命令。原因主要分类有: 1.命令拼写错误 2.软件路径配置错误 3.Linux 系统就没有安装该命令。 一、确认命令没有拼写错误 Linux 中的所有命令都是…

使用CSS的object-position实现图片在img标签中的定位

在CSS中&#xff0c;object-position属性它允许我们精确地控制替换元素&#xff08;如<img>、<video>等&#xff09;内容在其容器内的位置。通过指定水平和垂直方向的偏移量&#xff0c;可以轻松地调整元素内容在容器内的起始点&#xff0c;实现精准定位。 1 语法…

Poly Kernel Inception Network在遥感检测中的应用

摘要 https://export.arxiv.org/pdf/2403.06258 遥感图像&#xff08;RSI&#xff09;中的目标检测经常面临一些日益严重的挑战&#xff0c;包括目标尺度的巨大变化和多样的上下文环境。先前的方法试图通过扩大骨干网络的空间感受野来解决这些挑战&#xff0c;要么通过大核卷积…

嵌入式-4种经典继电器驱动电路-单片机IO端口/三极管/达林顿管/嵌套连接

文章目录 一&#xff1a;继电器原理二&#xff1a;单片机驱动电路三&#xff1a;经典继电器驱动电路方案3.1 继电器驱动电路方案一&#xff1a;I/O端口灌电流方式的直接连接3.1.1 方案一的继电器特性要求3.1.2 方案一可能会损坏I/O口 3.2 继电器驱动电路方案二&#xff1a;三极…

深度学习-part3(反向传播、GAN)

5. 反向传播 5.1 什么是反向传播&#xff1f;‍ 通俗解释&#xff1a;类比几个人站成一排&#xff0c;第一个人看一幅画&#xff08;输入数据&#xff09;&#xff0c;描述给第二个人&#xff08;隐层&#xff09;……依此类推&#xff0c;到最后一个人&#xff08;输出&…

EDI在汽车主机厂配送流程中的应用

汽车主机厂的汽车配送流程始于汽车 “生产结束 ” &#xff0c;止于 “交付给经销商 ” 。在这个流程中&#xff0c;企业作为主机厂的下游供应商&#xff0c;与主机厂的物流服务供应商之间的信息交换将会变得十分重要。 配送流程&#xff1a;运输订单以及报告 汽车主机厂提供预…

Elasticsearch8.x版本Java客户端Elasticsearch Java API 如何并发修改

前言 并发控制&#xff0c;一般有两种方案&#xff0c;悲观锁和乐观锁&#xff0c;其中悲观锁是默认每次更新操作肯定会冲突&#xff0c;所以每次操作都要先获取锁&#xff0c;操作完毕再释放锁&#xff0c;适用于写比较多的场景。而乐观锁是默认每次更新操作都不会冲突&#…

完成系统支持Github三方登录

文章目录 1、需求2、在对接系统中完成客户端注册3、创建客户端应用4、CommonOAuth2Provider SpringSecurity OAuth2.0文档&#xff1a; https://docs.spring.io/spring-security/reference/servlet/oauth2/index.html 1、需求 对接Github&#xff0c;在自己系统实现支持Githu…

【C++初阶】第七站:string类的初识(万字详解、细节拉满)

前言&#xff1a; &#x1f4cd;本文知识点&#xff1a;string的初识 本专栏&#xff1a;C 目录 一、什么是STL 二、STL的六大组件 三、STL的缺陷 四、为什么学习string类&#xff1f; 五、标准库中的string类 1、string类(了解) 2、string类的常用接口说明&#xff08;…