OkHttp是一个开源的HTTP客户端库,用于在Java和Kotlin应用程序中进行网络请求和处理响应。它由Square开发,提供了简单、高效且易于使用的API。
- 支持HTTP/2和SPDY:OkHttp支持最新的HTTP协议版本,包括HTTP/2和SPDY,以提供更快速和高效的网络通信。
- 连接池和请求重用:OkHttp自动管理连接池,重用现有的连接,减少网络请求的延迟和资源消耗。
- 请求和响应拦截器:OkHttp提供了拦截器机制,可以在发送请求和接收响应的过程中进行拦截和修改。这使得添加自定义的头部、身份验证、日志记录等功能变得非常简单。
- 响应缓存:OkHttp支持响应缓存,可以减少网络请求,提高应用程序的性能和响应速度。
- WebSocket支持:OkHttp内置了对WebSocket协议的支持,可以轻松地建立和管理WebSocket连接,实现实时通信。
- 安全性支持:OkHttp提供了TLS和SSL的支持,包括证书验证和证书固定等功能,确保网络通信的安全性。
- 异步请求和回调: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中的五个重要的拦截器:
- RetryInterceptor(重试拦截器):当请求失败时,RetryInterceptor会自动重试请求。它可以通过设置最大重试次数和重试间隔来控制重试行为。
- CacheInterceptor(缓存拦截器):CacheInterceptor会检查是否有可用的缓存响应,并在没有网络连接时返回缓存响应。它还会更新缓存以确保数据的一致性。
- ConnectInterceptor(连接拦截器):ConnectInterceptor负责建立与服务器的连接。它会处理TLS握手、HTTP代理和重定向等操作。
- CallServerInterceptor(调用服务器拦截器):CallServerInterceptor负责向服务器发送请求并接收响应。它还会处理重定向、压缩和身份验证等操作。
- BridgeInterceptor(桥接拦截器):BridgeInterceptor负责将用户请求转换为网络请求,并将服务器响应转换为用户响应。它还会处理请求头、响应头和请求体等操作。
这些拦截器可以按照一定的顺序组合在一起,以实现不同的功能和逻辑
网友评论