美文网首页
高性能网络请求框架OKHTTP

高性能网络请求框架OKHTTP

作者: BlueSocks | 来源:发表于2023-11-06 22:26 被阅读0次

    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"/>
    
    

    依赖库

    // 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同步请求

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

    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异地请求
     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同步请求(表单提交)
    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异步请求(表单提交)
    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的实现,对请求的发送和响应进行了一些信息输出

    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
        }
    }
    
    

    使用

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

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

    相关文章

      网友评论

          本文标题:高性能网络请求框架OKHTTP

          本文链接:https://www.haomeiwen.com/subject/fqmxwdtx.html