Retrofit+OkHttp笔记

关于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 添加拦截器

常用的拦截器有如下这些

  1. 重试拦截器(RetryInterceptor):用于在请求失败时自动重试。
  2. 缓存拦截器(CacheInterceptor):用于缓存网络请求的响应数据。
  3. 日志拦截器(LoggingInterceptor):用于打印网络请求和响应的详细信息。
  4. 认证拦截器(AuthenticatorInterceptor):用于添加认证信息到请求头中。
  5. 自定义拦截器(CustomInterceptor):用于实现自定义的网络请求处理逻辑。

  • 9
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值