高性能网络请求框架OKHTTP

OkHttp是一个开源的HTTP客户端库,用于在Java和Kotlin应用程序中进行网络请求和处理响应。它由Square开发,提供了简单、高效且易于使用的API。

  1. 支持HTTP/2和SPDY:OkHttp支持最新的HTTP协议版本,包括HTTP/2和SPDY,以提供更快速和高效的网络通信。
  2. 连接池和请求重用:OkHttp自动管理连接池,重用现有的连接,减少网络请求的延迟和资源消耗。
  3. 请求和响应拦截器:OkHttp提供了拦截器机制,可以在发送请求和接收响应的过程中进行拦截和修改。这使得添加自定义的头部、身份验证、日志记录等功能变得非常简单。
  4. 响应缓存:OkHttp支持响应缓存,可以减少网络请求,提高应用程序的性能和响应速度。
  5. WebSocket支持:OkHttp内置了对WebSocket协议的支持,可以轻松地建立和管理WebSocket连接,实现实时通信。
  6. 安全性支持:OkHttp提供了TLS和SSL的支持,包括证书验证和证书固定等功能,确保网络通信的安全性。
  7. 异步请求和回调:OkHttp支持异步请求和回调机制,可以在后台线程中发送请求,并在请求完成后得到相应的回调结果 使用方法如下

网络请求

kotlin 复制代码
<uses-permission android:name="android.permission.INTERNET"/>

依赖库

kotlin 复制代码
// define a BOM and its version
implementation(platform("com.squareup.okhttp3:okhttp-bom:4.11.0"))
// define any required OkHttp artifacts without version
implementation("com.squareup.okhttp3:okhttp")
implementation("com.squareup.okhttp3:logging-interceptor")

1. GET

1.get同步请求

同步请求不应在主线程进行

kotlin 复制代码
val client=OkHttpClient()
 fun get(){//网络请求主体
        Thread(Runnable {
//            构建请求主体
            val request:Request=Request.Builder()
                .url(BASE_URL)
                .build()
//            构建请求对象
            val call:Call= client.newCall(request)
//            发起同步请求execute--同步执行
            val response:Response=call.execute()

            val body:String ?=response.body?.string()
            Log.v("mainokk","$body")
        }).start()
    }
2. get异地请求
kotlin 复制代码
 val client=OkHttpClient()
 fun getAsync(){//网络请求主体
        val request:Request=Request.Builder()
            .url(BASE_URL)
            .build()
//            构建请求对象
        val call:Call= client.newCall(request)
//            发起同步请求execute--同步执行
       call.enqueue(object :Callback{
            override fun onFailure(call: Call, e: IOException) {
                TODO("Not yet implemented")
            }

            override fun onResponse(call: Call, response: Response) {
                val body:String ?=response.body?.string()
                Log.v("mainokk","$response")
            }
        })
    }

异步请求的步骤和同步请求类似,只是调通了call的enquene方法异步请求,结果通过回调callback的onResponse方法和onFailure方法处理

基本流程都是先创建一个okHttpClient对象,然后通过Request.Builder()创建一个Request对象,OkHttpClient对象调用newCall()并传入Request对象就能获得一个call对象

区别在于execute()和enquene()方法的调用,调用execute()为同步请求并返回Response对象

调用enquene()方法测试通过callback的形式返回Response对象

2. POST

POST请求与GET请求不同的地方在于Request。Builder的post()方法,post()方法需要一个RequestBody的对象作为参数

1. post同步请求(表单提交)
kotlin 复制代码
val client=OkHttpClient()
fun post(){
    Thread(Runnable{
        val body:FormBody=FormBody.Builder()
            .add("","")
            .build()
        val request =Request.Builder().url(BASE_URL)
            .post(body)
            .build()
        val call:Call= client.newCall(request)
        val response:Response=call.execute()
        Log.v("mainokk","$response")
    })
}
2. post异步请求(表单提交)
kotlin 复制代码
val client=OkHttpClient()
fun postAsync(){//网络请求主体
    val body:FormBody=FormBody.Builder()
        .add("","")
        .build()
    val request:Request=Request.Builder()
        .url(BASE_URL)
        .post(body)
        .build()
    val call:Call= client.newCall(request)
    call.enqueue(object :Callback{
        override fun onFailure(call: Call, e: IOException) {
            TODO("Not yet implemented")
        }
        override fun onResponse(call: Call, response: Response) {
            val body:String ?=response.body?.string()
            Log.v("mainokk","${response.body?.string()}")
        }
    })
}

3. 拦截器LoggingInterceptor

拦截器是OkHttp当中一个比较强大的机制,可以监视,重写和重试调用请求

这是一个比较简单的Interceptor的实现,对请求的发送和响应进行了一些信息输出

kotlin 复制代码
class loggingInterceptor:Interceptor {
    override fun intercept(chain: Interceptor.Chain): Response {
        val time_start:Long=System.nanoTime()
        val request=chain.request()
        val response=chain.proceed(request)
        val buffer= Buffer()
        request.body?.writeTo(buffer)
        val resquestBodyStr:String=buffer.readUtf8()
        Log.e("OKHTTP",String.format(""))
        val bussinessData=response.body?.string()?:"response"
        val mediaType=response.body?.contentType()
        val newBody=ResponseBody.create(mediaType,bussinessData)
        val newResponse=response.newBuilder().body(newBody).build()
        val time_end:Long=System.nanoTime()
        Log.e("OKHTTP",String.format(""))
        return newResponse
    }
}

使用

kotlin 复制代码
val client=OkHttpClient.Builder()
    .addInterceptor(loggingInterceptor())
    .build()

以下是OkHttp中的五个重要的拦截器:

  1. RetryInterceptor(重试拦截器):当请求失败时,RetryInterceptor会自动重试请求。它可以通过设置最大重试次数和重试间隔来控制重试行为。
  2. CacheInterceptor(缓存拦截器):CacheInterceptor会检查是否有可用的缓存响应,并在没有网络连接时返回缓存响应。它还会更新缓存以确保数据的一致性。
  3. ConnectInterceptor(连接拦截器):ConnectInterceptor负责建立与服务器的连接。它会处理TLS握手、HTTP代理和重定向等操作。
  4. CallServerInterceptor(调用服务器拦截器):CallServerInterceptor负责向服务器发送请求并接收响应。它还会处理重定向、压缩和身份验证等操作。
  5. BridgeInterceptor(桥接拦截器):BridgeInterceptor负责将用户请求转换为网络请求,并将服务器响应转换为用户响应。它还会处理请求头、响应头和请求体等操作。

这些拦截器可以按照一定的顺序组合在一起,以实现不同的功能和逻辑

相关推荐
花花鱼18 小时前
android kotlin 基础复习 class类
android·kotlin
ClassOps2 天前
Kotlin 流 Flow
android·开发语言·kotlin
ljx14000525502 天前
Kotlin 范型之协变、逆变、不变
java·kotlin
zh路西法2 天前
基于Android Studio的行程记录APK开发指南(二):熟悉一个项目结构
android·ide·kotlin·android studio
ljx14000525502 天前
从源码角度分析 Kotlin by lazy 的实现
kotlin
折翅鵬2 天前
自定义控件实现类似于抖音加载动画效果
android·kotlin
我要最优解3 天前
记录工作中学习进度
android·笔记·学习·kotlin
AntDreamer5 天前
Android经典实战之Textview文字设置不同颜色、下划线、加粗、超链接等效果
android·java·面试·kotlin
花花鱼6 天前
android kotlin基础复习—if when
android·kotlin
吃饱很舒服6 天前
java 动态代理实现
android·java·开发语言·kotlin·androidx