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

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

相关推荐
bytebeats1 天前
Kotlin 注解全面指北
android·java·kotlin
jzlhll1232 天前
kotlin android Handler removeCallbacks runnable不生效的一种可能
android·开发语言·kotlin
&岁月不待人&2 天前
Kotlin 协程使用及其详解
开发语言·kotlin
苏柘_level62 天前
【Kotlin】 基础语法笔记
开发语言·笔记·kotlin
大福是小强2 天前
002-Kotlin界面开发之Kotlin旋风之旅
kotlin·函数式编程·lambda·语法·运算符重载·扩展函数
大耳猫2 天前
Android Studio 多工程公用module引用
android·java·kotlin·android studio
良技漫谈2 天前
Rust移动开发:Rust在Android端集成使用介绍
android·程序人生·rust·kotlin·学习方法
北欧人写代码2 天前
idea java 项目右键new file时 为什么是 kotlin class 不是普通class
java·kotlin·intellij-idea
zhangphil2 天前
Android LoaderManager AsyncTaskLoader,Kotlin(4)
android·kotlin
大福是小强2 天前
004-Kotlin界面开发快速入水之TicTacToe
开发语言·kotlin·界面开发·gui·教程·桌面应用·快速入水