-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathHttpConfig.kt
195 lines (173 loc) · 7.47 KB
/
HttpConfig.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
package com.tbright.ktbaseproject.demo.customconfig
import com.google.gson.JsonSyntaxException
import com.jakewharton.retrofit2.adapter.kotlin.coroutines.CoroutineCallAdapterFactory
import com.tbright.ktbaselibrary.base.BaseResponse
import com.tbright.ktbaselibrary.event.MessageEvent
import com.tbright.ktbaselibrary.global.GlobalConfig
import com.tbright.ktbaselibrary.global.TIME_OUT
import com.tbright.ktbaselibrary.net.exception.NoNetworkException
import com.tbright.ktbaselibrary.net.interceptor.CacheInterceptor
import com.tbright.ktbaselibrary.net.interceptor.MultiUrlInterceptor
import com.tbright.ktbaselibrary.proxy.HttpConfigProxy
import kotlinx.coroutines.Deferred
import okhttp3.OkHttpClient
import okhttp3.logging.HttpLoggingInterceptor
import org.json.JSONException
import retrofit2.HttpException
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
import java.io.InterruptedIOException
import java.net.ConnectException
import java.net.SocketTimeoutException
import java.net.UnknownHostException
import java.util.concurrent.TimeUnit
import javax.net.ssl.SSLHandshakeException
const val UNAUTHORIZED = 401
const val FORBIDDEN = 403
const val NOT_FOUND = 404
const val REQUEST_TIMEOUT = 408
const val INTERNAL_SERVER_ERROR = 500
const val BAD_GATEWAY = 502
const val SERVICE_UNAVAILABLE = 503
const val GATEWAY_TIMEOUT = 504
const val EVENTCODE_RELOGIN = 998 //需要重新登录
const val EVENTCODE_RESPONSE_FAIL = 999 //http请求失败
const val BASE_URL = "base_Url"
const val mBaseUrl = "https://api.apiopen.top/"
const val GANK_URL = "gank_Url"
const val mGankUrl = "https://gank.io/"
class HttpConfig : HttpConfigProxy() {
private var mRetrofit: Retrofit? = null
private var mRetrofitBuilder: Retrofit.Builder? = null
private var mOkHttpClientBuilder: OkHttpClient.Builder? = null
//
override var baseUrl: String = mBaseUrl
override var baseUrls: Map<String, String>
set(value) {}
get() {
var urls = linkedMapOf<String, String>()
if (urls.isNotEmpty()) return urls
if (GlobalConfig.isDebug) {//可以在这里动态切换服务
urls[BASE_URL] = mBaseUrl
urls[GANK_URL] = mGankUrl
} else {
urls[BASE_URL] = mBaseUrl
urls[GANK_URL] = mGankUrl
}
return urls
}
override suspend fun <T> parseResponseData(responseData: Deferred<BaseResponse<T>>): T? {
try {
var response = responseData.await()
if (response.isResponseSuccess()) {
return response.getResponseData()
} else {
MessageEvent( EVENTCODE_RESPONSE_FAIL,response.getResponseMessage()).send()
return null
}
} catch (e: Throwable) {
var errMsg = "网络异常"
when (e) {
is UnknownHostException -> errMsg = "连接失败"
is ConnectException -> errMsg = "连接失败"
is SocketTimeoutException -> errMsg = "连接超时"
is InterruptedIOException -> errMsg = "连接中断"
is SSLHandshakeException -> errMsg = "证书验证失败"
is JSONException -> errMsg = "数据解析错误"
is JsonSyntaxException -> errMsg = "数据解析错误"
is NoNetworkException -> errMsg = "无可用网络"
is HttpException -> {
when (e.code()) {
UNAUTHORIZED, FORBIDDEN -> {//这两个一般会要求重新登录
MessageEvent(EVENTCODE_RELOGIN,errMsg).send()
return null
}
}
}
else -> errMsg = e.message.toString()
}
MessageEvent(EVENTCODE_RESPONSE_FAIL, errMsg).send()
}
return null
}
override suspend fun <T> parseResponseWrapperData(responseData: Deferred<BaseResponse<T>>,vararg needDisposeError:Any): BaseResponse<T>? {
try {
var response = responseData.await()
if (response.isResponseSuccess()) {
return response
} else {
if(needDisposeError.contains(response.getResponseStatus())){//如果包含,不统一处理,在相应的页面特殊处理
return response
}else{
MessageEvent( EVENTCODE_RESPONSE_FAIL,response.getResponseMessage()).send()
return null
}
}
} catch (e: Throwable) {
var errMsg = "网络异常"
when (e) {
is UnknownHostException -> errMsg = "连接失败"
is ConnectException -> errMsg = "连接失败"
is SocketTimeoutException -> errMsg = "连接超时"
is InterruptedIOException -> errMsg = "连接中断"
is SSLHandshakeException -> errMsg = "证书验证失败"
is JSONException -> errMsg = "数据解析错误"
is JsonSyntaxException -> errMsg = "数据解析错误"
is NoNetworkException -> errMsg = "无可用网络"
is HttpException -> {
when (e.code()) {
UNAUTHORIZED, FORBIDDEN -> {//这两个一般会要求重新登录
MessageEvent(EVENTCODE_RELOGIN,errMsg).send()
return null
}
}
}
else -> errMsg = e.message.toString()
}
MessageEvent(EVENTCODE_RESPONSE_FAIL, errMsg).send()
}
return null
}
override fun initRetrofit() {
initClient()
mRetrofitBuilder = Retrofit.Builder()
mRetrofit = mRetrofitBuilder?.run {
baseUrl(GlobalConfig.httpConfigProxy?.baseUrl ?: GlobalConfig.httpConfigProxy?.baseUrls!!.values.first())//如果项目就一个域名,可以直接使用baseUrl,baseUrls可以不用管
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(CoroutineCallAdapterFactory())
.client(mOkHttpClientBuilder!!.build())
.build()
build()
}
}
private var mRetrofitServices = hashMapOf<String, Any>()
@Suppress("UNCHECKED_CAST")
override fun <T> create(clazz: Class<T>): T {
var key = clazz.canonicalName
var mRetrofitService = mRetrofitServices[key]
if (mRetrofitService == null) {
mRetrofitService = mRetrofit!!.create(clazz)
mRetrofitServices[key!!] = mRetrofitService!!
}
return mRetrofitService as T
}
private fun initClient() {
mOkHttpClientBuilder = OkHttpClient.Builder()
mOkHttpClientBuilder?.run {
if (GlobalConfig.isDebug) {
val loggingInterceptor = HttpLoggingInterceptor()
loggingInterceptor.level = HttpLoggingInterceptor.Level.BODY
//设置 Debug Log 模式
addInterceptor(loggingInterceptor)
}
connectTimeout(TIME_OUT, TimeUnit.SECONDS)
readTimeout(TIME_OUT, TimeUnit.SECONDS)
writeTimeout(TIME_OUT, TimeUnit.SECONDS)
//错误重连
retryOnConnectionFailure(true)
addInterceptor(CacheInterceptor())
addInterceptor(HeaderInterceptor())
addInterceptor(MultiUrlInterceptor())
}
}
}