OkHttp

news2024/11/15 11:05:49

文章目录

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

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

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

相关文章

VSCode下使用github初步

由于各种需要,现在需要统一将一些代码提交搞github,于是有了在VSCode下使用github的需求。之前只是简单的使用git clone,代码提交这些用的是其他源代码工具,于是得学习实操下,并做一记录以备后用。 安装 VSCode安装 …

【ZooKeeper】1、基本介绍

本文基于 Apache ZooKeeper Release 3.7.0 版本书写 作于 2022年3月6日 14:22:11 转载请声明 1、Zookeeper是什么? 由ZooKeeper的官网介绍可知: ZooKeeper 是Apache原子基金会下一个开源的、用于提供可靠的分布式协同的服务器。 ZooKeeper 可以用来 配置…

【保姆级教程】YOLOv8_Pose多类别关键点检测,姿态识别:训练自己的数据集

Yolov8官方给出的是单类别的人体姿态关键点检测,本文将记录如果实现训练自己的多类别的关键点检测。 一、YOLOV8环境准备 1.1 下载安装最新的YOLOv8代码 仓库地址: https://github.com/ultralytics/ultralytics1.2 配置环境 pip install -r requiremen…

Python基于深度学习的中文情感分析系统,附源码

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…

文心一言赋能问卷生成,打造高效问卷调研工具

当前,各种大语言模型(LLM,Large Language Model)井喷式发展,基于LLM的应用也不断涌现。但是,当开发者基于LLM开发下游应用时,LLM直接生成的结果在格式、内容等方面都存在许多不确定因素&#xf…

unity发布安卓获取读取权限

一、Player Settings 设置 Player Settings>Player>Other Settings> Android > Write Permission > External (SDCard). 二、代码 using System.Collections; using System.Collections.Generic; using System.IO; using UnityEngine; using UnityEngine.Andr…

【Unity】获取游戏对象或组件的常用方法

前言 在Unity开发过程中,我们经常需要获取组件,那么在Unity里如何获取组件呢? 一、获取游戏对象 1.GameObject.Find GameObject.Find 是通过物体的名称获取对象的 所以会遍历当前整个场景,效率较低 而且只能获取激活状态的物体…

GPT实战系列-LangChain的Prompt提示模版构建

GPT实战系列-LangChain的Prompt提示模版构建 LangChain GPT实战系列-LangChain如何构建基通义千问的多工具链 GPT实战系列-构建多参数的自定义LangChain工具 GPT实战系列-通过Basetool构建自定义LangChain工具方法 GPT实战系列-一种构建LangChain自定义Tool工具的简单方法…

生成微信小程序二维码

首页 -> 统计 可以通过上面二个地方配置,生成小程序的二维码,并且在推广分析里,有详细的分析数据,

spring-boot-starter-thymeleaf加载外部html文件

在Spring MVC中,我们可以使用Thymeleaf模板引擎来实现加载外部HTML文件。 1.Thymeleaf介绍 Thymeleaf是一种现代化的服务器端Java模板引擎,用于构建漂亮、可维护且易于测试的动态Web应用程序。它适用于与Spring框架集成,并且可以与Spring M…

LLM4Decompile: Decompiling Binary Code with Large Language Models

LLM4Decompile: Decompiling Binary Code with Large Language Models 相关链接:arxiv github 关键字:反编译、大型语言模型、二进制代码、源代码、程序语义 摘要 LLM4Decompile是一种使用大型语言模型(LLMs)进行二进制代码反编译…

【QED】斐波那契游戏

文章目录 题目思路代码复杂度分析时间复杂度空间复杂度 总结 题目 题目链接🔗 斐波那契数列指的是这样一个数列:1,1,2,3,5,8,13,21,34,55&#x…

视频技术1:使用ABLMediaServer推流rtsp

ABLMediaServer定位是高性能、高稳定、开箱即用、商用级别的流媒体服务器 下边展示了如何把1个mp3作为输入源,转换为rtsp流的过程。 作用:用rtsp模拟摄像头的视频流 1、启动ABLMediaServer ABLMediaServer-2024-03-13\WinX64\ABLMediaServer.exe 配…

电话机器人语音识别用哪家更好精准度更高。

语音识别系统的选择取决于你的具体需求,包括但不限于识别精度、速度、易用性、价格等因素。以下是一些在语音识别领域表现较好的公司和产品: 科大讯飞:科大讯飞是中国最大的语音识别技术提供商之一,其语音识别技术被广泛应用于各…

Linux的背景介绍

1.Linux的发展史 Linux,一般指GNU/Linux(单独的Linux内核并不可直接使用,一般搭配GNU套件,故得此称呼),是一种免费使用和自由传播的类UNIX操作系统,其内核由林纳斯本纳第克特托瓦兹&#xff08…

人生就是不断炼心的一个过程,不断continental,不断挑战,重构。

回头看,轻舟已过万重山,早上,使用VSCODE,将以前的bootstrap响应式不断引入新元素。直接全部安装插件。如下图所示。 问题,遇到了github登录问题,还有就是git命令报错,域名hosts,404,nginx等知识…

STM32实验DMA数据搬运小助手

本次实验做的是将一个数组的内容利用DMA数据搬运小助手搬运到另外一个数组中去。 最后的实验结果: 可以看到第四行的数据就都不是0了,成功搬运了过来。 DMA实现搬运的步骤其实不是很复杂,复杂的是结构体参数: 整个步骤为&#xf…

配置视图解析器

配置视图解析器: 我们在指定视图的时候路径是有重复的,重复的操作可以用视图解析器,让框架帮我们: mv.setViewName("/WEB-INF/view/show.jsp");mv.setViewName("/WEB-INF/VIEW/other.jsp"); ​​​​​​​ …

前后端分离项目部署服务器教程--实践成功

文章目录 项目介绍流程1租界云服务2通过远程软件连接服务器3部署前后端代码停止功能文件 环境配置1.安装jdk2.安装Nginx3.安装mysql数据库 花了将近一天部署前后端的项目,写一个日志记录一下,话说孰能生巧。明天把服务器恢复初始在部署一下。 项目介绍 …

五、初识Django

初识Django 五、初识Django1.安装django2.创建项目2.1第一种方式:在终端2.2第二种方式:Pycharm 3.创建app4.快速上手4.1再写一个页面4.2templates模板4.3静态文件4.3.1static目录4.3.2引用静态文件 5.模板语法案例:伪联通新闻中心6.请求和相应…