

android-网络框架解析–第2篇OkHttp(4.0.x)—请求和响应流程(interceptors)
source link: http://www.demanmath.com/index.php/2020/10/14/android-wangluokuangjiajiexidi2pianokhttp4-0-xqingqiuhexiangyingliuchenginterceptors/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

请求和响应流程
见图。

整个流程处理的网络链接和通信是在ConnectInterceptor & CallInterceptor来进行的。
其中interceptors和netinterceptors是user自定义的拦截器。
interceptor
自定义的拦截器。但是这里的和view的事件分发事件里的拦截器略有区别。
这里不是真正的拦截,因为拦截会打断整个网络请求的流程,所以给予user一个处理事物的入口。
常见的拦截器配置如下
日志拦截器
override fun intercept(chain: Interceptor.Chain): Response {
val TAG = "OKHttp"
val request = chain.request()
BaseLog.i(TAG+request.hashCode(),":${request.url}")
val headers = request.headers
for(i in 0 until headers.size){
var name = headers.name(i)
if (name == "timestamp" || name == "sign" || name == "openid") {
continue
}
if (!"Content-Type".equals(name, ignoreCase = true) && !"Content-Length".equals(name, ignoreCase = true)) {
BaseLog.i(TAG + request.hashCode(), name + ": " + headers.value(i))
}
}
var requestBody = request.body
requestBody?.let {
var buffer = Buffer()
if(isPlaintext(buffer)){
try {
requestBody.writeTo(buffer)
} catch (e: IOException) {
e.printStackTrace()
}
val contentType = requestBody.contentType()
if (contentType != null) {
val charset =
contentType.charset(Charset.forName("UTF-8"))
if (charset != null) {
BaseLog.i(
TAG + request.hashCode(),
"requestBody: " + buffer.readString(charset)
)
}
}
}
}
val response = chain.proceed(request)
var responseBody = response.peekBody(1024*1024)
BaseLog.i(TAG + request.hashCode(), "responseBody: ${responseBody.string()}")
return response
}
private fun isPlaintext(buffer: Buffer): Boolean {
return try {
val prefix = Buffer()
val byteCount = if (buffer.size < 64) buffer.size else 64
buffer.copyTo(prefix, 0, byteCount)
for (i in 0..15) {
if (prefix.exhausted()) {
break
}
val codePoint = prefix.readUtf8CodePoint()
if (Character.isISOControl(codePoint) && !Character.isWhitespace(
codePoint
)
) {
return false
}
}
true
} catch (e: EOFException) {
false // Truncated UTF-8 sequence.
}
}
header处理
override fun intercept(chain: Interceptor.Chain): Response {
val request = chain.request()
val builder = request.newBuilder()
builder.addHeader("Content-type", "application/json; charset=utf-8")
.addHeader("Accept", "application/json")
.addHeader("os", "Android")
return chain.proceed(request)
}
RetryInterceptor
重试,这个retry和RetryAndFollowUpInterceptor不是一个东西。那个是重定向interceptor
private var retryNum = 0;
override fun intercept(chain: Interceptor.Chain): Response {
var request = chain.request()
BaseLog.d("retryNum:$retryNum")
var response = chain.proceed(request)
while (!response.isSuccessful && retryNum<maxRetry){
retryNum++
BaseLog.d("retryNum:$retryNum")
response = chain.proceed(request)
}
return response
}
netInterceptors
这个设计,是因为interceptors是网路链接之前的数据,这个阶段是拿不到网络请求的相关资料,比如请求端口。
获取本地请求ip&端口
通过android自带的ipaddress是拿不到这个port字段的,通过分析源码,OkHttp是通过Socket链接的,这个是可以拿到port的。
override fun intercept(chain: Interceptor.Chain): Response {
val request = chain.request()
try {
val realChain = chain as RealInterceptorChain
val realConnect = realChain.exchange().connection()
val socket = realConnect?.socket()
socket?.let {
AppLog.i("local address:${socket.localAddress.hostAddress},local port:${socket.localPort}")
}
} catch (e: Exception) {
e.printStackTrace()
}
return chain.proceed(request)
}
Recommend
-
107
1、OkHttp 的基本使用 OkHttp 是 Square 的一款应用于 Android 和 Java 的 Http 和 Http/2 客户端。使用的时候只需要在 Gradle 里面加入下面一行依赖即可引入: implementation 'com.squa
-
62
Github: okhttp 分析版本: 930d4d0 An HTTP client for Android, Kotlin,...
-
24
OkHttpClinet 1.newCall 产生一个新call,核心是new,应为一个client可以对应很多个call。 从app的生命周期来讲,client可以是单例,call必须一个请求一个,call finish或者calcel以后,就结束了。 2.newWebSocket websocket的...
-
14
OkHttpClient.Builder 产生OkHttpClient的builder设计模式。 原则上OkHttpClient可以配置的...
-
17
Retrofit2 完全解析 探索与okhttp之间的关系
-
17
一、OkHttp介绍 HTTP是现代应用常用的一种交换数据和媒体的网络方式,高效地使用HTTP能让资源加载更快,节省带宽。OkHttp是一个优秀的网络请求框架,它有以下默认特性: 支持HTTP/2,允许所有同一个主机地址的请求共享同一个socket连接
-
12
Android OkHttp完全解析 是时候来了解OkHttp了 ...
-
10
Android Https相关完全解析 当OkHttp遇到Https ...
-
8
OkHttp Interceptors in AndroidGroupGroupGroupGroupGroupGroupGroupGroupGroupGroupShapeGroupGroupGroupGroupGroupGroupGroupGroupGroupGroupGroupGroupGroupGroupGroupGroupGroupGroupGroupGroupGroupGroupGroupGroupGroupGroupGroupGroupGroupGroupGroupGroup...
-
12
Android网络请求(3) 网络请求框架OkHttp 本节我们来讲解OkHtpp网络请求框架 什么是网络请求框架 在我的理解中,网络请求框架是为了方便我们更加便捷规范的进行网络请求所...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK