高性能网络请求框架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负责将用户请求转换为网络请求,并将服务器响应转换为用户响应。它还会处理请求头、响应头和请求体等操作。

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

相关推荐
alexhilton8 小时前
Compose中的ContentScale:终极可视化指南
android·kotlin·android jetpack
jzlhll1239 小时前
kotlin Flow first() last()总结
开发语言·前端·kotlin
符哥200813 小时前
充电桩 WiFi 局域网配网(Android/Kotlin)流程、指令及实例说明文档
android·开发语言·kotlin
大傻^17 小时前
SpringAI2.0 Null Safety 实战:JSpecify 注解体系与 Kotlin 互操作
android·开发语言·人工智能·kotlin·springai
jzlhll12321 小时前
Kotlin Mutex vs Java ReentrantLock vs synchronized
java·开发语言·kotlin
Kapaseker21 小时前
一杯 Kotlin 美式品味 object 声明
android·kotlin
俩个逗号。。1 天前
Kotlin 扩展函数详解
开发语言·kotlin
su1ka1112 天前
Kotlin(3)基本语法
kotlin
su1ka1112 天前
Kotlin(4)面向对象
kotlin
鹧鸪晏2 天前
搞懂 kotlin 泛型 out 和 in 关键字
android·kotlin