关于Retrofit配置OkHttp常规代码解读与纪录
class ServiceGenerator @Inject constructor() {
private val okHttpBuilder: OkHttpClient.Builder = OkHttpClient.Builder()
private val retrofit: Retrofit
private var headerInterceptor = Interceptor { chain ->
val original = chain.request()
val request = original.newBuilder()
.header(contentType, contentTypeValue)
.method(original.method, original.body)
.build()
chain.proceed(request)
}
private val logger: HttpLoggingInterceptor
get() {
val loggingInterceptor = HttpLoggingInterceptor()
if (BuildConfig.DEBUG) {
loggingInterceptor.apply { level = HttpLoggingInterceptor.Level.BODY }
}
return loggingInterceptor
}
init {
okHttpBuilder.addInterceptor(headerInterceptor)
okHttpBuilder.addInterceptor(logger)
okHttpBuilder.connectTimeout(timeoutConnect.toLong(), TimeUnit.SECONDS)
okHttpBuilder.readTimeout(timeoutRead.toLong(), TimeUnit.SECONDS)
val client = okHttpBuilder.build()
retrofit = Retrofit.Builder()
.baseUrl(BASE_URL)
.client(client)
.addConverterFactory(MoshiConverterFactory.create(getMoshi()))
.build()
}
fun <S> createService(serviceClass: Class<S>): S {
return retrofit.create(serviceClass)
}
private fun getMoshi(): Moshi {
return Moshi.Builder()
.add(KotlinJsonAdapterFactory())
.build()
}
}
一、Retrofit对象创建过程中,方法的解释
1、baseUrl 设置基URL
Q:设置了baseUrl后,API注解中拼的是全路径的URL会如何解析
例如注解:@GET(https://pics1.baidu.com/feed/43a7d933c895d143009a1701e3426a0f5baf0760.jpeg)
对应的api则无视设置的baseUrl,会以这个注解中的全路径进行访问网络。
Q:可否不设置baseUrl?
A:不可以,Retrofit中在创建其对象时会判断是否为空,为空时抛出异常,源码如下:
if (baseUrl == null) { throw new IllegalStateException("Base URL required."); }
Q:可否不设置为空字符串?
不可以,设置时会做Url解析,错误字符串解析失败会抛出异常。、
2、client 设置okHttpClient
Q:client是否可以不设置?
A:可以不设置,retrofit内部会会在build示例时,创建默认的client对象。
3、addInterceptor 添加拦截器
常用的拦截器有如下这些
- 重试拦截器(RetryInterceptor):用于在请求失败时自动重试。
- 缓存拦截器(CacheInterceptor):用于缓存网络请求的响应数据。
- 日志拦截器(LoggingInterceptor):用于打印网络请求和响应的详细信息。
- 认证拦截器(AuthenticatorInterceptor):用于添加认证信息到请求头中。
- 自定义拦截器(CustomInterceptor):用于实现自定义的网络请求处理逻辑。