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支持异步请求和回调机制,可以在后台线程中发送请求,并在请求完成后得到相应的回调结果 使用方法如下

网络请求

<uses-permission android:name="android.permission.INTERNET"/>
  • 1.

依赖库

// 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.
  • 2.
  • 3.
  • 4.
  • 5.

1. GET

1.get同步请求

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

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()
    }
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
2. get异地请求
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")
            }
        })
    }
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.

异步请求的步骤和同步请求类似,只是调通了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同步请求(表单提交)
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")
    })
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
2. post异步请求(表单提交)
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()}")
        }
    })
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.

3. 拦截器LoggingInterceptor

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

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

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
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.

使用

val client=OkHttpClient.Builder()
    .addInterceptor(loggingInterceptor())
    .build()
  • 1.
  • 2.
  • 3.

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

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

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

最后

如果想要成为架构师或想突破20~30K薪资范畴,那就不要局限在编码,业务,要会选型、扩展,提升编程思维。此外,良好的职业规划也很重要,学习的习惯很重要,但是最重要的还是要能持之以恒,任何不能坚持落实的计划都是空谈。

如果你没有方向,这里给大家分享一套由阿里高级架构师编写的《Android八大模块进阶笔记》,帮大家将杂乱、零散、碎片化的知识进行体系化的整理,让大家系统而高效地掌握Android开发的各个知识点。

高性能网络请求框架OKHTTP_网络请求


相对于我们平时看的碎片化内容,这份笔记的知识点更系统化,更容易理解和记忆,是严格按照知识体系编排的。