OkHttp 系列二:OkHttp 的基本使用与请求流程

111 阅读2分钟

OkHttp 的基本使用与请求流程

本文概述

  • 文章以具体实例介绍了OkHttp 的直接使用过程并额外说明了OkHttp 的部分自定义功能;

OkHttp 的基本使用

基本说明:

  • 一般情况下,不会直接使用OkHttp 完成Http 协议通信

    • 因为其功能受限,一般使用Retrofit 等OkHttp 的二次封装框架

具体实例

  • 编写思路:

    • 实例化okHttpClient:使用建造者设计模式进行选配

      • 可选配置:

        • 缓存(缓存存放位置,缓存大小)、超时时间、Cookie、自定义分发器、自定义DNS解析
      • 示意代码:

       var okHttpClient = OkHttpClient.Builder()
           .cache(Cache(File(""),1024))
           .build()
      
    • 实例化Request 对象:使用建造者设计模式进行选配

      • 必须要配置的:请求的URL

      • 选配:请求方式

        • get:默认
        • post:需要传入请求体
       var request  = Request.Builder()
           .url("https://www.baidu.com")
           .get()
           .build()
      
    • 实例化Call 对象:将request 实例丢给OkHttp 实例

       var call = okHttpClient.newCall(request)
      
    • 获取请求结果:可以直接拿到字符串、也可以使用流的方式进行处理

      • 同步请求:excute

      • 异步请求:enqueue

      • 示意图:

      图片.png

      • 示意代码:

         val result = call.execute()
        
    • 可选:打印请求结果

      • 示意代码:
       println(result.isSuccessful)
      
      • 运行结果:

        图片.png

      • 底层原理:根据response 的响应码来判断的

        • isSuccessful

        图片.png

        • isRedirect

        图片.png

    • 通过响应结果拿到数据

      • 可以以字符串、字节流等形式展示响应体

      image-20220729210538308

    • 结果关闭:

       result.close()
      
  • 完整代码:

     ​
     package com.enjoy.okhttp4
     ​
     import okhttp3.Cache
     import okhttp3.OkHttpClient
     import okhttp3.Request
     import org.junit.Test
     import java.io.File
     ​
     class OkHttpTest {
         @Test
         fun useOkHttp(){
             var okHttpClient = OkHttpClient.Builder()
                 .cache(Cache(File(""),1024))
                 .build()
     ​
             var request  = Request.Builder()
                 .url("https://www.baidu.com")
                 .get()
                 .build()
     ​
             var call = okHttpClient.newCall(request)
     ​
             val result = call.execute()
     ​
             println(result.isSuccessful)
     ​
             result.close()
         }
     }
    

OkHttp 的执行流程

  • 流程图:

    image-20220729210840871

  • 分发器:决定任务什么时候正式执行

    • 内部维护队列与线程池,完成请求调配
  • 拦截器:完成具体的执行过程

    • 完成整个请求过程,最终会返回结果