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 {@Overridepublic 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负责请求的调度和管理,而线程池负责实际的网络操作和数据传输。
  • 这种设计既保证了网络请求的有序执行,又避免了资源的过度消耗。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

留学文书可以彻底被AI取代吗?升学指导这一职业是否会被AI逼到墙角?

近日,ChatGPT再次“进化”,其最新版本ChatGPT-4又掀高潮。其生产者OpenAI 称,“ChatGPT-4是最先进的系统,能生产更安全和更有用的回复。”和上一代相比,GPT-4拥有了更广的知识面和更强的解决问题能力,在创意…

机器学习_聚类(k-means)

文章目录 聚类步骤k-means APIKmeans性能评估指标Kmeans性能评估指标API 聚类步骤 k-means通常被称为劳埃德算法,这在数据聚类中是最经典的,也是相对容易理解的模型。算法执行的过程分为4个阶段。 1.首先,随机设K个特征空间内的点作为初始的…

详细分析Mysql中的LOCATE函数(附Demo)

目录 1. 基本概念2. Demo3. 实战 1. 基本概念 LOCATE()函数在SQL中用于在字符串中查找子字符串的位置 它的一般语法如下: LOCATE(substring, string, start)LOCATE()函数返回子字符串在主字符串中第一次出现的位置 如果未找到子字符串,则返回0 具体的…

Vue/Uni-app/微信小程序 v-if 设置出场/退出动画(页面交互不死板,看起来更流畅)

天梦星服务平台 (tmxkj.top)https://tmxkj.top/#/ 在Vue.js中&#xff0c;使用v-if进行条件渲染时设置动画可以通过<transition>组件来实现。 具体操作步骤如下&#xff1a; 包裹条件渲染的元素&#xff1a;您需要将要通过v-if控制显示隐藏的元素包裹在<transition…

keil软件不能连接STM32,烧录程序无法执行

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 问题现象解决方法 问题现象 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 最近在学习江科大的STM32的时候&#xff0c;学到11-2 硬件SPI读写W2…

跳绳计数,YOLOV8POSE

跳绳计数&#xff0c;YOLOV8POSE 通过计算腰部跟最初位置的上下波动&#xff0c;计算跳绳的次数

HTML静态网页成品作业(HTML+CSS)——个人介绍网页(1个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有1个页面。 二、作品演示 三、代…

Linux:Gitlab:16.9.2 (rpm包) 部署及基础操作(1)

1.基础环境 我只准备了一台gitlab服务器&#xff0c;访问就用真机进行访问&#xff0c;接下来介绍一下详细配置 centos7 内网ip:192.168.6.7 外网ip:172.20.10.4 运行内存&#xff1a;4G CPU:4核 先去配置基础环境 关闭防火墙以及selinux 再去下载基础的运行…

有趣且重要的JS知识合集(20)screen/client/scroll/offset等坐标属性知识点

1、线上链接地址 浏览器坐标属性 2、screen系列 2.1、screenX&#xff1a; 鼠标位置相对于用户屏幕水平偏移量 2.2、screenY&#xff1a; 鼠标位置相对于用户屏幕垂直偏移量 3、client系列 3.1、clientX: 鼠标位置相对于文档的左边距&#xff08;不随页面滚动而改变&a…

【目标检测经典算法】R-CNN、Fast R-CNN和Faster R-CNN详解系列三:Faster R-CNN图文详解

【目标检测经典算法】R-CNN、Fast R-CNN和Faster R-CNN详解系列二&#xff1a;Fast R-CNN图文详解 概念预设 感受野 感受野(Receptive Field) 是指特征图上的某个点能看到的输入图像的区域。 神经元感受野的值越大表示其能接触到的原始图像范围就越大&#xff0c;也意味着它…

LeetCode链表hard 有思路?但写不出来?

给你链表的头节点 head &#xff0c;每 k 个节点一组进行翻转&#xff0c;请你返回修改后的链表。 k 是一个正整数&#xff0c;它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍&#xff0c;那么请将最后剩余的节点保持原有顺序。 你不能只是单纯的改变节点内部的值…

用docker启动centos的桌面环境

最近在dockerhub看见centos的桌面镜像 拉取镜像&#xff1a;docker pull kasmweb/centos-7-desktop:1.14.0 VNC_PWpassword输入你自己的密码 运行容器&#xff1a;docker run --rm -it --shm-size512m -p 6901:6901 -e VNC_PWpassword kasmweb/centos-7-desktop:1.14.0 该镜…

Python 实现1~100之间的偶数求和

result0 for i in range(101):if i%20:result result i print(result) 或者 result0 for i in range(2,101,2):result result i print(result)

【附下载】3Ds Max从安装、配置到入门提高和高级用法

#3Ds Max 一、安装 1.1 安装说明 地址&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1lwKMbgbE32wCL6PpMv706A?pwddll8 提取码&#xff1a;dll8 –来自百度网盘超级会员V2的分享 安装说明&#xff1a;文件夹里有安装说明 安装解压即可 关键就是将crack文件放到自己…

LVS+Keepalived 高可用群集--部署

实际操作 LVS Keepalived 高可用群集 环境设备 LVS1192.168.6.88 &#xff08;MASTER&#xff09;LVS2192.168.6.87 &#xff08;BACKUP&#xff09;web1192.168.6.188web2192.168.6.189客户端192.168.6.86VIP192.168.6.180 &#xff08;一&#xff09;web服务器 首先配置…

鸿蒙Harmony应用开发—ArkTS声明式开发(绘制组件:Polygon)

多边形绘制组件。 说明&#xff1a; 该组件从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 无 接口 Polygon(value?: {width?: string | number, height?: string | number}) 从API version 9开始&#xff0…

软件杯 深度学习 python opencv 火焰检测识别 火灾检测

文章目录 0 前言1 基于YOLO的火焰检测与识别2 课题背景3 卷积神经网络3.1 卷积层3.2 池化层3.3 激活函数&#xff1a;3.4 全连接层3.5 使用tensorflow中keras模块实现卷积神经网络 4 YOLOV54.1 网络架构图4.2 输入端4.3 基准网络4.4 Neck网络4.5 Head输出层 5 数据集准备5.1 数…

注册-前端部分

前提&#xff1a;后端jar环境、Vue3环境、Redis环境 搭建页面&#xff08;html标签、css样式&#xff09; → 绑定数据与事件&#xff08;表单校验&#xff09; → 调用后台接口&#xff08;接口文档、src/api/xx.js封装、页面函数中调用&#xff09; Login.vue文件&#xff…

CentOS的安装

一、打开VMware的WorkStation的软件界面。点击创建新的虚拟机。 二、我们选择自定义&#xff0c;下一步。 三、这个界面不用动&#xff0c;直接进入下一步。 四、点击稍后安装操作系统&#xff0c;下一步。 五、选择Linux操作系统&#xff0c;版本为CentOS 7 64位。 六、虚拟机…

Day69:WEB攻防-Java安全JWT攻防Swagger自动化算法签名密匙Druid泄漏

目录 Java安全-Druid监控-未授权访问&信息泄漏 黑盒发现 白盒发现 攻击点 Java安全-Swagger接口-导入&联动批量测试 黑盒发现 白盒发现 自动化发包测试 自动化漏洞测试 Java安全-JWT令牌-空算法&未签名&密匙提取 识别 JWT 方式一&#xff1a;人工识…