kotlin协程网络请求简单封装okhttp3+retrofit2,可自定义请求头

 添加依赖

implementation "com.squareup.okhttp3:okhttp:4.2.2"
implementation "com.squareup.retrofit2:retrofit:2.9.0"
implementation "com.squareup.retrofit2:converter-gson:2.9.0"
implementation "com.squareup.okhttp3:logging-interceptor:4.9.0"

ApiFactory


import android.util.Log
import android.util.SparseArray
import com.google.gson.GsonBuilder
import okhttp3.Interceptor
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.logging.HttpLoggingInterceptor
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
import java.util.concurrent.TimeUnit


object ApiFactory {
    private val TAG: String = "HttpLogInfo"
    private val urls: SparseArray<String> = SparseArray()
    private val retrofits: SparseArray<Retrofit> = SparseArray()
    private var customHeaders: Map<String, String> ? = null
    private const val CONNECT_TIMEOUT = 60L
    private const val READ_TIMEOUT = 60L
    private const val WRITE_TIMEOUT = 10L

    /**
     * @param baseUrl 地址
     * @param clazz api
     * @param newHeaders 自定义请求头
     */
    fun <T> createService(
        baseUrl: String,
        clazz: Class<T>,
        newHeaders: Map<String, String>? = null
    ): T {
        val indexOfValue = urls.indexOfValue(baseUrl)
        val retrofit =
            if (newHeaders != customHeaders) {//请求头不相同
                if (indexOfValue >= 0) {
                    //清除之前保存的url请求
                    urls.remove(indexOfValue)
                    retrofits.remove(indexOfValue)
                }
                customHeaders = newHeaders
                //重新获取retrofit
                getRetrofit(baseUrl, newClient(newHeaders))
            } else if (indexOfValue >= 0) {
                //内存中存在直接取出来使用
                retrofits.get(indexOfValue)
            } else {
                //内存中没有则重新获取
                getRetrofit(baseUrl, newClient())
            }
        return retrofit.create(clazz)
    }

    private fun getRetrofit(baseUrl: String, newClient: OkHttpClient): Retrofit =
        Retrofit.Builder().run {
            baseUrl(baseUrl)
            client(newClient)
            addConverterFactory(
                GsonConverterFactory.create(
                    GsonBuilder().serializeNulls().create()
                )
            )
            val build = build()
            val index = urls.size()
            urls.append(index, baseUrl)
            retrofits.append(index, build)
            build
        }

    private fun newClient(headers: Map<String, String>? = null) =
        OkHttpClient.Builder().apply {
            retryOnConnectionFailure(true)
            connectTimeout(CONNECT_TIMEOUT, TimeUnit.SECONDS)
            readTimeout(READ_TIMEOUT, TimeUnit.SECONDS)
            writeTimeout(WRITE_TIMEOUT, TimeUnit.SECONDS)
            addInterceptor(HttpLoggingInterceptor(HttpLog()).setLevel(HttpLoggingInterceptor.Level.BODY))
            headers?.let {
                //添加自定义请求头
                addInterceptor(Interceptor { chain ->
                    val original: Request = chain.request()
                    val requestBuilder: Request.Builder = original.newBuilder()
                    for ((key, value) in it) {
                        requestBuilder.addHeader(key, value)
                    }
                    val request: Request = requestBuilder.build()
                    chain.proceed(request)
                })
            }
        }.build()

    class HttpLog : HttpLoggingInterceptor.Logger {
        override fun log(message: String) {
            Log.d(TAG, message)
        }
    }
}

使用

自定义请求头,我这里是传的是登录返回的token,根据自己需要传值,也可以不传

object NetworkService {

    private const val BASE_URL = "http://192.168.0.144:8089/test/"

//    val api by lazy { ApiFactory.createService(BASE_URL, Api::class.java) }

    val api by Service()

    class Service {
        operator fun getValue(thisRef: Any, property: KProperty<*>): Api {
            var hashMap :Map<String, String> ?= null
            if (!StringUtils.isTrimEmpty(UserManager.token)) {
                hashMap = HashMap()
                hashMap["Authorization"] = "Bearer ${UserManager.token!!}"
            }
            return ApiFactory.createService(BASE_URL, Api::class.java, hashMap)
        }
    }

}

 根据后端的返回值,定义接收数据实体类的公共字段

open class ResultData<T> {
    var success:Boolean = false
    var errorCode:Int = 0
    var errorMsg:String = ""
    var data:T ?= null
}

class PageResult<T>:ResultData<T>(){
    /**
     * 当前页数
     */
    val currentPage: Int? = null

    /**
     * 当前页数条数
     */
    val currentPageSize: Int? = null

    /**
     * 总页数
     */
    val totalPageSize: Int? = null

    /**
     * 总条数
     */
    val totalSize: Long? = null
}

API接口

interface Api {

    @POST("sys/loginIn")
    suspend fun  login(@Body jsonObject: JsonObject) : ResultData<LoginResult>

    @GET("tPlan/getPlanList")
    suspend fun getPlanList(
        @Query("pageNum") pageNum: Int,
        @Query("pageSize") pageSize: Int,
        @Query("order") order: String? = null
    ): PageResult<List<WaitDealBean>>

}

调用接口

class LoginActivityVM : BaseViewModel() {

    private val _loginState = MutableLiveData<Boolean>().apply {
        value = false
    }
    val loginState: LiveData<Boolean> = _loginState
    
    fun login() = launch({
        val jsonObject= JsonObject()
        jsonObject.addProperty("tel","150")
        jsonObject.addProperty("passWord","123")
        val result = NetworkService.api.login(jsonObject)
        if(result.success){
            _loginState.value = true
            val data = result.data
            UserManager.loginSuccess(data)
        }
    }, onError = {

    })
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值