Android中OKHttp使用及原理解析

OkHttp3源码详解(一) Request类,2021年Android开发实战 HttpUrl主要用来规范普通的url连接,并且解析url的组成部分 现通过下面的例子来示例httpUrl的使用 https://www.google.com/search?q=maplejaw ①使用parse解析url字符串: HttpUrl url = HttpUrl.parse(“https://www.google.com/search?q=maplejaw”); ②通过构造者模式来常见: HttpUrl url = new HttpUrl.Builder() .scheme(“ 阅读详情


OkHttp

一、简介

OkHttp是一款优秀的网络请求框架,针对于传输层的一种封装,基于socket通信
OkHttp有2.0版本和3.0的版本,目前常用的是OkHttp3

二、使用

1.引入库

编辑app/build.gradle文件在dependencies闭包中添加如下内容:

implementation 'com.squareup.okhttp3:okhttp:4.4.0'

2.同步post请求

代码如下:

		// 实例化OkHttpClient对象
        OkHttpClient client = new OkHttpClient();
        //实例化RequestBody对象
        RequestBody requestBody = new FormBody.Builder()
                .add("", "")
                .build();
        // 实例化Request对象
        Request request = new Request.Builder()
                .url("www.baidu.com")
                .post(requestBody)
                .build();
        try {
            // Response对象存储的就是获取的数据
            Response response = client.newCall(request).execute();
            String data = response.body().string();
        } catch (IOException e) {
            e.printStackTrace();
        }

3.异步post请求

代码如下:

		//异步请求
		OkHttpClient client = new OkHttpClient();
		RequestBody requestBody = new FormBody.Builder()
                .add("", "")
                .build();
        Request request = new Request.Builder()
                .url("www.baidu.com")
                .post(requestBody)
                .build();
		client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {

            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                String responseData = response.body().string();
                setUI(responseData);
            }
        });

4.封装OkHttp框架

OkHttpModel.java:

public class OkHttpModel {

    private static final String TAG = "OkHttpModel";

    private Context context;
    private OkHttpClient mOkHttpClient;

    public OkHttpModel(Context context){
        this.context = context;
        this.mOkHttpClient = new OkHttpClient();
    }

    public <T> void get(String url, Map<String, Object> params, ICallBack iCallBack) {
        final Request request = new Request.Builder()
                .url(url)
                .build();
        mOkHttpClient.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                iCallBack.onFailed(e.toString());
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                if(response.isSuccessful()){
                    final String result = response.body().string();
                    Log.d(TAG, "run: " + result);
                    iCallBack.onSuccess(result);
                }
            }
        });
    }

    public <T> void post(String url, Map<String, Object> params, ICallBack iCallBack) {
        FormBody.Builder bodyBuilder = new FormBody.Builder();
        for (String key : params.keySet()) {
            bodyBuilder.add(key, (String)params.get(key));
        }
        final Request request = new Request.Builder()
                .url(url)
                .post(bodyBuilder.build())
                .build();
        mOkHttpClient.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                iCallBack.onFailed(e.toString());
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                if(response.isSuccessful()){
                    final String result = response.body().string();
                    Log.d(TAG, "run: " + result);
                    iCallBack.onSuccess(result);
                }
            }
        });
    }
}

ICallBack.java

public interface ICallBack<T> {
    void onSuccess(T response);
    void onFailed(String failed);
}

三、源码解析

1.请求流程

RealCall.java:

  @Override public Call newCall(Request request) {
    return new RealCall(this, request);
  }
  @Override public Response execute() throws IOException {
    synchronized (this) {
      if (executed) throw new IllegalStateException("Already Executed");
      executed = true;
    }
    try {
      client.dispatcher().executed(this);
      Response result = getResponseWithInterceptorChain();
      if (result == null) throw new IOException("Canceled");
      return result;
    } finally {
      client.dispatcher().finished(this);
    }
  }
  //判断是否重复请求
  synchronized void setForWebSocket() {
    if (executed) throw new IllegalStateException("Already Executed");
    this.retryAndFollowUpInterceptor.setForWebSocket(true);
  }

  @Override public void enqueue(Callback responseCallback) {
    synchronized (this) {
      if (executed) throw new IllegalStateException("Already Executed");
      executed = true;
    }
    client.dispatcher().enqueue(new AsyncCall(responseCallback));
  }

AsyncCall.java (RealCall的内部类)

final class AsyncCall extends NamedRunnable {
    private final Callback responseCallback;

    private AsyncCall(Callback responseCallback) {
      super("OkHttp %s", redactedUrl().toString());
      this.responseCallback = responseCallback;
    }

    String host() {
      return originalRequest.url().host();
    }

    Request request() {
      return originalRequest;
    }

    RealCall get() {
      return RealCall.this;
    }

    @Override protected void execute() {
      boolean signalledCallback = false;
      try {
        Response response = getResponseWithInterceptorChain();
        if (retryAndFollowUpInterceptor.isCanceled()) {
          signalledCallback = true;
          responseCallback.onFailure(RealCall.this, new IOException("Canceled"));
        } else {
          signalledCallback = true;
          responseCallback.onResponse(RealCall.this, response);
        }
      } catch (IOException e) {
        if (signalledCallback) {
          // Do not signal the callback twice!
          Platform.get().log(INFO, "Callback failure for " + toLoggableString(), e);
        } else {
          responseCallback.onFailure(RealCall.this, e);
        }
      } finally {
        client.dispatcher().finished(this);
      }
    }
  }

总结:okHttpClient Request—>newCall—>RealCall.enqueue()—>判断是否重复请求—>dispatcher.enqueue()—>运行队列中请求数小于64,并且访问同一机器目标Host请求数小于5,直接加入到运行队列,否则加入到等待队列—>运行队列中,调用AsyncCall的excute方法直接运行—>通过责任链获取请求响应

2.构建者模式和责任链模式在OkHttp中应用

  • 构建者模式创建对象:使用多个简单对象构成复杂对象,(Builder类,独立于其他对象),当内部数据过于复杂时,可以方便的构建出想要的对象,不用传递所有参数,但有代码冗余
Request request = new Request.Builder()
                .url(url)
                .build();
  • 责任链模式处理网络请求:分级处理
private Response getResponseWithInterceptorChain() throws IOException {
    // Build a full stack of interceptors.
    List<Interceptor> interceptors = new ArrayList<>();
    //自定义拦截器(可自己添加处理)
    interceptors.addAll(client.interceptors());
    //重试重定向拦截器
    interceptors.add(retryAndFollowUpInterceptor);
    //桥拦截器(添加Header,gzip)
    interceptors.add(new BridgeInterceptor(client.cookieJar()));
    //缓存拦截器(减少重复的网络请求,通过时间判断)
    interceptors.add(new CacheInterceptor(client.internalCache()));
    //连接拦截器(在连接池中拿socket对象)
    interceptors.add(new ConnectInterceptor(client));
    if (!retryAndFollowUpInterceptor.isForWebSocket()) {
    //网络请求拦截器(可以观察到所有通过网络传输的数据)
      interceptors.addAll(client.networkInterceptors());
    }
    //callServer拦截器(数据交互)
    interceptors.add(new CallServerInterceptor(
        retryAndFollowUpInterceptor.isForWebSocket()));

    Interceptor.Chain chain = new RealInterceptorChain(
        interceptors, null, null, null, 0, originalRequest);
    return chain.proceed(originalRequest);
  }

总结:自定义拦截器(可自己添加处理)—>重试重定向拦截器—>桥拦截器(添加Header,gzip)—>缓存拦截器(减少重复的网络请求,通过时间判断)—>连接拦截器(在连接池中拿socket对象)—>网络请求拦截器(可以观察到所有通过网络传输的数据)—>callServer拦截器(数据交互)

  • 添加自定义拦截器
 OkHttpClient okHttpClient = new OkHttpClient.Builder()
                .addInterceptor(new Interceptor())
                .build();

3.OkHttp对网络请求做了哪些优化

  • 缓存拦截器
  • 桥拦截器

4.怎么设计一个网络请求框架

  • 参考现有框架
  • 考虑扩展,优化(Https)

5.OkHttp2和OkHttp3的区别

1、包名改变
包名改了由之前的com.squareup.http改为 okhttp3

2、OkHttpClient参数配置(构建者模式)
之前参数可以直接mOkHttpClient.setCache(cache)设置,现在OkHttpClient使用构建者模式,需要在OkHttpClient.Builder上设置可配置

Android开发-使用Okhttp发送请求并解析服务器返回的数据 使用okhttp向服务器发送请求 首先添加依赖 目前最新版本3.14.1,github地址 implementation 'com.squareup.okhttp3:okhttp:3.14.1' 向服务器发送GET请求并获取服务器返回的数据 OkHttpClient client = new OkHttpClient.Builder() //创建okhttp实例 ... 阅读详情

相关推荐

Android OkHttp SSL证书验证全解析:从原理到安全实践

SSL/TLS证书验证是HTTPS安全通信的基石,它通过数字证书机制确保客户端与服务器之间的身份可信与数据传输安全。其核心原理涉及非对称加密、证书链验证和信任锚点等概念,在移动应用开发中直接关系到用户数据隐私和防中间人攻击能力。OkHttp作为Android主流网络库,其默认的证书验证机制基于系统信任库,但在开发测试、企业内网或特定集成场景下,开发者常需处理自签名证书、证书链不完整等验证异常。本文聚焦OkHttp的TrustManager机制与HostnameVerifier等关键组件,提供分场景的安全解决

weixin_30608503的博客 382

Android网络通讯之OkHttp

OkHttp是安卓上常用的网络请求框架,不止可以发送http请求,还可以发送socket请求等。官网地址:https://square.github.io/okhttp/

不积跬步无以至千里,不积小流无以成江海。一个喜欢学习分享的程序员 7707

Android应用中使用Kotlin集成OkHttp库:从基础使用到深层原理解析

本文详细介绍了在Android应用中用Kotlin集成OkHttp的方法和核心原理。主要内容包括:1) 如何添加OkHttp依赖并实现基本的GET/POST请求;2) OkHttp的分层架构设计,包括拦截器链机制和连接池复用原理;3) 通过Kotlin协程实现异步网络请求。文章还提供了OkHttp拦截器链执行流程的简化代码示例,展示了其责任链模式的设计思想。这些内容为Android开发者提供了OkHttp从基础使用到深层原理的全面指导。

dongdeaiziji的专栏 844

[Android]网络框架之OkHttp(详细)(kotlin)

由Square公司贡献的一个处理网络请求的开源项目,是目前Android使用最广泛的网络框架。从Android4.0开始HttpURLConnection的底层实现采用的是OkHttp。OkHttp的介绍,添加依赖,OkHttp的使用get的同步与异步请求post的同步与异步请求POST请求的数据格式POST请求上传文件POST请求上传json对象POST请求上传多个数据OkHttp的配置1.Builder构建器2.自定义拦截器3.自定义缓存4. 自定义Cookie

weixin_63357306的博客 1万+

Android网络请求框架OKHttp的使用详解

本文通过简单明了的示例介绍了如何在Android项目中使用OKHttp进行网络请求。以上代码中,我们在onResponse方法中处理了请求成功的响应数据,在onFailure方法中处理了请求失败的情况。除了发送基本的GET和POST请求,OKHttp还提供了许多其他功能,包括文件上传、文件下载、连接超时设置等。首先,在你的Android项目中的build.gradle文件中添加OKHttp的依赖项。以上代码中,我们使用FormBody.Builder来构建表单数据,并将其作为POST请求的请求体。

TechBurst的博客 1306

深入解析Android网络通信框架:OkHttp与Retrofit原理与实践

本文系统分析了Android主流网络框架OkHttp与Retrofit的核心原理与实践应用。OkHttp采用分层架构设计,通过连接池机制实现高效连接复用,拦截器系统实现模块化处理。Retrofit利用动态代理技术将接口方法映射为HTTP请求,支持灵活的注解处理和响应适配。文章详细探讨了性能优化策略(连接调优、缓存控制、流量压缩)和复杂场景解决方案(动态路由、证书锁定),并提供了面试题库与框架扩展方法。最后展望了HTTP/3和协程集成等前沿技术,总结了模块化设计、协议抽象等工程哲学思想。

郑伟强dev的专栏 96

Android OkHttp 框架的使用与源码、原理解析

为了提升应用的健壮性,开发者可以自定义异常处理机制。通过在拦截器中捕获异常,并进行统一的处理和封装,可以将复杂的异常信息转化为更友好、易于理解的错误提示。例如,可以创建一个自定义的异常类NetworkException,在拦截器中捕获各种 OkHttp 异常,并根据异常类型创建NetworkException实例,同时添加详细的错误描述信息。

顾林海 3149

RAD Studio 10.4.2 安装避坑指南:从镜像加载到首次运行的全流程解析

本文提供了一份详尽的RAD Studio 10.4.2安装避坑指南,涵盖从镜像验证、文件提取到安装激活的全流程。重点解析了安装教程中常见的权限、路径及激活顺序等关键“坑点”,旨在帮助开发者,尤其是Delphi和C++Builder新手,一次性顺利完成安装与配置,确保开发环境稳定运行。

weixin_29224309的博客 327

Android之OKhttp原理解析

目录 1、okhttp工作的大致流程 2、okhttp中的连接 3、Dispatcher和线程池 4、OkHttp中的设计模式 5、OkHttp的优势 一、okhttp工作的大致流程 1、整体流程 当我们通过OkhttpClient创建一个Call,并发起同步或异步请求时; okhttp会通过Dispatcher对我们所有的RealCall(Call的具体实现类)进行统一管理,并通过execut...

恬静释然的博客 2786

《深入浅出强化学习原理入门》学习笔记(三)机器人找金币应用实例

《深入浅出强化学习原理入门》学习笔记(三)MDP应用实例

lxs3213196的博客 3186

在macOS上使用GitHub的超详细指南

GitHub:免费的远程仓库,可用来托管自己的开源项目。它利用了Git强大的克隆和分支功能,让我们参与别人的开源项目和让别人参与自己的开源项目变得简单高效。

Mars的博客 3391

Android OkHttp 全面解析:从原理到实践

OkHttp 是 Square 公司开发的一个高效的 HTTP 客户端,它具有以下特点:支持 HTTP/2,允许对同一主机的所有请求共享一个套接字连接池减少了请求延迟(如果 HTTP/2 不可用)透明的 GZIP 压缩减少了下载大小响应缓存完全避免了重复请求的网络传输@Override// 使用自定义拦截器.build();OkHttp 作为 Android 平台上最流行的网络请求库之一,其设计精良、功能强大且易于扩展。

专注于移动开发的干货分享。提供高效解决方案、避坑指南与前沿技术解析。为开发者创造价值。 1099

别再手动连线了!用Tessent IJTAG的SIB和TDR,5分钟搞定复杂芯片的DFT网络分区

本文探讨了如何利用Tessent IJTAG的SIB(Segment Insertion Bit)和TDR(Test Data Register)技术,高效解决复杂芯片DFT网络分区问题。通过智能化的扫描链管理和声明式定义,显著降低连接复杂度,提升测试覆盖率和良率,适用于超大规模SoC设计。

weixin_29251131的博客 300

安卓进阶(7)之OkHttp3.10拦截器原理解析

博客流程 用一个demo介绍如何添加自定义的拦截器; 介绍拦截器是怎么产生拦截效果的; 介绍okhttp里自带的各个拦截器的原理。 添加自定义的log拦截器 在使用okhttp时,我们可能需要获取到okhttp的log日志,请求参数以及响应参数和数据。我们用一个小的demo来展示一下: OkHttpClient client; void initOkhttpClient() { c...

罗小辉的专栏 1738

路径搜索算法——RRT*算法

RRT算法是RRT算法的优化版本,通过引入路径优化机制实现渐进最优性。该算法在高维空间和复杂环境中表现优异,主要步骤包括随机采样、树扩展和邻近节点重新连接。相比RRT,RRT能够不断优化路径质量,但计算复杂度更高。Python实现展示了其核心逻辑:随机采样扩展树节点,检查碰撞,选择最优父节点,并通过重新连接优化路径。算法适用于机器人导航等场景,但需平衡计算效率与路径质量。

swaggytiger的博客 3061

halcon与QT联合:(5.1)瓶盖检测以及QT界面搭建

halcon实现瓶盖检测与定位代码: dev_close_window() dev_open_window(0, 0, 1024, 1024, 'black', WindowHandle) list_image_files('C:/Users/TIMI/Desktop/picture/circle', 'default', [], ImageFiles) for J := 1 to 4 by 1 *read image read_image(halconImage, ImageFil

m0_37957160的博客 1044

android okhttp加公共参数_死磕Android_Retrofit 原理解析

Retrofit,一个远近闻名的网络框架,它是由Square公司开源的.Square公司,是我们的老熟人了,很多框架都是他开源的,比如OkHttp,picasso,leakcanary等等.他们公司的很多开源库,几乎已经成为现在开发Android APP的标配.简单来说,Retrofit其实是底层还是用的OkHttp来进行网络请求的,只不过他包装了一下,使得开发者在使用访问网络的时候更加方便简单高...

weixin_39690972的博客 196

计算数列位置N的值

本文介绍了一个数列生成问题,要求根据输入的两个整数M和N生成特定规则的数列,并输出第N个位置上的数值。数列生成规则为:前M个元素为1到M;后续元素根据前M个元素是否重复来决定计算方式(求和或求差)。文章提供了C++、Java和Python三种语言的实现方案,均包含输入处理、数列初始化、循环计算和结果输出等步骤。各语言实现中均使用集合去重特性判断重复元素,并通过内置函数或自定义方法求取最大值和最小值。该问题主要考察基础编程能力,包括数组/列表操作、最值计算和重复元素判断等基本编程技巧。

面试高手的博客 652

安卓进阶(6)之OkHttp整体架构/基本使用/OkHttpClient原理解析

整体架构图 Okhttp可以分为上层应用接口层,协议层,连接层,缓存层,I/O层,拦截器层。接口层就是我们上层开发人员调用的一些接口和API。连接层是核心,连接池以及网络请求优化都在这里面了。拦截器和缓存层是重点,比如我们要加log日志,这时候加一个拦截器。OkHttp的整体架构图如图所示: 基本使用 GET请求 //创建OkHttpClient对象 OkHttpClient client = ...

罗小辉的专栏 1244

PyTorch生成式人工智能——VQ-VAE详解与实现

VQ-VAE (Vector Quantised-Variational AutoEncoder) 的核心思想就是将 VAE 的连续潜变量离散化。它通过学习一个码本 (Codebook) 来实现这一点,码本是一个包含有限个嵌入向量的字典。模型不是直接输出一个连续的潜在向量,而是从码本中找出与编码器输出最接近的嵌入向量来代替它。本节首先详细讲解 VQ-VAE 的技术原理,然后使用 PyTorch 从零开始实现 VQ-VAE 模型。

盼小辉丶的博客 3284

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

安卓进阶(10)之OkHttp3.10连接层原理解析

参考文章 OkHttp3源码解读四:连接层 TCP连接与OKHTTP复用连接池

罗小辉的专栏 799

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Android网络请求篇-OkHttp原理解析1(框架流程篇)

一直想写一篇 简洁而不失内涵 的OKHTTP源码分析,甚至从19年春节前就开始翻阅OkHttp的源码。但是赶上春节事多心杂,没能将心中所想梳理出来。 现在疫情当前,节约了外出活动的时间,静心打磨了此文,希望对看本文的小伙伴有所帮助,更希望 武汉坚强,祖国安康。 本文源码基于OkHttp3.14.6,该版本是Java版最新的一版,后续的4.*全面使用了Kotlin,如有需要可再进行分析。 针对OkHttp我打算开两篇进行分析。 第1篇分析整体的框架设计,以及大方向的请求流程。 第2篇分析具体拦截器的功能逻辑。

qq_42795723的博客 793

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

【源码深度】Android 网络机制全解析|HTTP、HTTPS、OkHttp、Retrofit 原理与优化|Android全栈体系150讲-15

u013365435的博客 32

Android开发实战讲解!来一份全面的面试宝典练练手,面试真题解析

开头 Android开发中,热修复技术被越来越多的开发者使用,市面上也出现很多成熟的开源框架。但对大部分开发者来说,热修复依然是一个既熟悉又陌生的词。仅仅知道热修复的作用,会使用框架,那样意义并不大。我们还要知道热修复的原理,这样不管框架如何变化,只要基本原理不变,我们都可以快速掌握它,或者自己动手写一个适合项目的热修复框架。 阿里技术一面-35min 自我介绍 Android 有没有遇到OOM问题(有遇到内存泄漏问题) Handler机制 ThreadLocal Activity启动到加载View过程

m0_52308677的博客 130

Android-多线程编程(用okhttp实现get请求并显示在主页面上并解析原理)

Handler 异步消息处理机制的使用方法: public class MainActivity extends AppCompatActivity { public static final int UPDATE_TEXT=1; private TextView mcontent; private static String string; private st...

xqy3177563的博客 981

android okhttp3封装_Android进阶:七、Retrofit2.0原理解析之最简流程【上】

retrofit 已经流行很久了,它是Square开源的一款优秀的网络框架,这个框架对okhttp进行了封装,让我们使用okhttp做网路请求更加简单。但是光学会使用只是让我们多了一个技能,学习其源码才能让我们更好的成长。本篇文章是在分析retrofit的源码流程,有大量的代码,读者最好把源码下载下来导入IDE,然后跟着一起看,效果会更好(文末有源码获取方式)一.retrofit入门定义网络请求的...

weixin_39814393的博客 169
下一篇: 计算机网络面试题总结
浮空over
博客等级 码龄7年 6粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值