Android Retrofit工具类 (kotlin版本)

前言

之前写过一个工具类,实现网络请求,最近在搞kotlin,作为没系统学习kotlin 就要应用到项目上,也算是一大挑战,虽然会kotlin的人都说很简单。
所以尝试这写一下kotlin版本的工具类

正文

import android.annotation.SuppressLint
import android.util.Log
import com.google.gson.Gson
import io.reactivex.Observable
import io.reactivex.Observer
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.Disposable
import io.reactivex.schedulers.Schedulers
import okhttp3.Interceptor
import okhttp3.MediaType
import okhttp3.MultipartBody
import okhttp3.OkHttpClient
import okhttp3.RequestBody
import okhttp3.Response
import okhttp3.ResponseBody
import retrofit2.Retrofit
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory
import retrofit2.http.Body
import retrofit2.http.FieldMap
import retrofit2.http.FormUrlEncoded
import retrofit2.http.GET
import retrofit2.http.HeaderMap
import retrofit2.http.Multipart
import retrofit2.http.POST
import retrofit2.http.Part
import retrofit2.http.QueryMap
import retrofit2.http.Url
import java.io.File
import java.lang.reflect.ParameterizedType
import java.util.concurrent.TimeUnit

//使用前 需要导入依赖
/*
    //retrofit
    implementation 'com.squareup.retrofit2:retrofit:2.9.0'
    //Gson converter
    implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
    //RxJava2 Adapter
    implementation 'com.squareup.retrofit2:adapter-rxjava2:2.9.0'
    //RxJava
    implementation 'io.reactivex.rxjava2:rxjava:2.2.10'
    implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
    implementation 'nl.bravobit:android-ffmpeg:1.1.7'
*/

class RetrofitUtils(url: String) {
    private val gson = Gson()
    private var isOpenLog = false//是否打开log
    private var classname = ""
    private val builder: MultipartBody.Builder

    //初始化
    init {
        val build = OkHttpClient().newBuilder().addInterceptor(LoggingInterceptor())
            .connectTimeout(1000 * 30, TimeUnit.MILLISECONDS)
            .writeTimeout(1000 * 30, TimeUnit.MILLISECONDS).build()
        API = Retrofit.Builder().baseUrl(url).client(build)
            .addCallAdapterFactory(RxJava2CallAdapterFactory.create()).build()
            .create(ApiService::class.java)
        builder = MultipartBody.Builder()
    }

    //单例获取对象
    companion object {
        private var instance: RetrofitUtils? = null

        fun getInstance(url: String): RetrofitUtils {
            if (instance == null) {
                instance = RetrofitUtils(url)
            }
            return instance!!
        }

        private const val TAG = "RetrofitUtils"
        private lateinit var API: ApiService
    }

    //get请求有参
    fun <T> doGet(url: String, map: Map<String, Any>, callBack: CallBack<T>) {
        API.doGet(url, map).subscribeOn(Schedulers.io()).subscribe(object : Observer<ResponseBody> {
            override fun onSubscribe(d: Disposable) {

            }

            override fun onError(e: Throwable) {
                callBack.onError(e.toString())
            }

            override fun onComplete() {

            }

            override fun onNext(t: ResponseBody) {
                val string = t.string()
                if (isOpenLog) {
                    Log.e(Companion.TAG, "onNext: $classname\n$string")
                }
                val genericInterfaces = callBack::class.java.genericInterfaces
                val parameterizedType = genericInterfaces[0] as ParameterizedType
                val actualTypeArguments = parameterizedType.actualTypeArguments
                val type = actualTypeArguments[0]
                val fromJson = gson.fromJson<T>(string, type)
                callBack.onSuccess(fromJson)
            }
        })
    }

    //get请求请求头 有参
    fun <T> doGet(
        url: String, header: Map<String, Any>, map: Map<String, Any>, callBack: CallBack<T>
    ) {
        API.doGet(url, header, map).subscribeOn(Schedulers.io())
            .subscribe(object : Observer<ResponseBody> {
                override fun onSubscribe(d: Disposable) {

                }

                override fun onError(e: Throwable) {
                    callBack.onError(e.toString())
                }

                override fun onComplete() {

                }

                override fun onNext(t: ResponseBody) {
                    val string = t.string()
                    if (isOpenLog) {
                        Log.e(Companion.TAG, "onNext: $classname\n$string")
                    }
                    val genericInterfaces = callBack::class.java.genericInterfaces
                    val parameterizedType = genericInterfaces[0] as ParameterizedType
                    val actualTypeArguments = parameterizedType.actualTypeArguments
                    val type = actualTypeArguments[0]
                    val fromJson = gson.fromJson<T>(string, type)
                    callBack.onSuccess(fromJson)
                }
            })
    }

    //get请求 返回值是集合
    fun <T> doGetArray(url: String, callBack: ArrayCallBack) {
        API.doGetArray(url).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
            .subscribe(object : Observer<ResponseBody> {
                override fun onSubscribe(d: Disposable) {
                }

                override fun onError(e: Throwable) {
                    callBack.onError(e.toString())
                }

                override fun onComplete() {

                }

                override fun onNext(t: ResponseBody) {
                    val string = t.string()
                    if (isOpenLog) {
                        Log.e(Companion.TAG, "onNext: $classname\n$string")
                    }
                    callBack.onSuccess(string)
                }
            })
    }

    //get请求 无参
    fun <T> doGet(url: String, callBack: CallBack<T>) {
        API.doGet(url).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
            .subscribe(object : Observer<ResponseBody> {
                override fun onSubscribe(d: Disposable) {

                }

                override fun onError(e: Throwable) {
                    callBack.onError(e.toString())
                }

                override fun onComplete() {

                }

                override fun onNext(t: ResponseBody) {
                    val string = t.string()
                    if (isOpenLog) {
                        Log.e(Companion.TAG, "onNext: $classname\n$string")
                    }
                    val genericInterfaces = callBack::class.java.genericInterfaces
                    val parameterizedType = genericInterfaces[0] as ParameterizedType
                    val actualTypeArguments = parameterizedType.actualTypeArguments
                    val type = actualTypeArguments[0]
                    val fromJson = gson.fromJson<T>(string, type)
                    callBack.onSuccess(fromJson)
                }
            })
    }

    //post请求 有参
    fun <T> doPost(url: String, map: Map<String, Any>, callBack: CallBack<T>) {
        API.doPost(url, map).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
            .subscribe(object : Observer<ResponseBody> {
                override fun onSubscribe(d: Disposable) {

                }

                override fun onError(e: Throwable) {
                    callBack.onError(e.toString())
                }

                override fun onComplete() {

                }

                override fun onNext(t: ResponseBody) {
                    val string = t.string()
                    if (isOpenLog) {
                        Log.e(Companion.TAG, "onNext: $classname\n$string")
                    }
                    val genericInterfaces = callBack::class.java.genericInterfaces
                    val parameterizedType = genericInterfaces[0] as ParameterizedType
                    val actualTypeArguments = parameterizedType.actualTypeArguments
                    val type = actualTypeArguments[0]
                    val fromJson = gson.fromJson<T>(string, type)
                    callBack.onSuccess(fromJson)
                }
            })
    }

    //post请求 无参
    fun <T> doPost(url: String, callBack: CallBack<T>) {
        API.doPost(url).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
            .subscribe(object : Observer<ResponseBody> {
                override fun onSubscribe(d: Disposable) {

                }

                override fun onError(e: Throwable) {
                    callBack.onError(e.toString())
                }

                override fun onComplete() {

                }

                override fun onNext(t: ResponseBody) {
                    val string = t.string()
                    if (isOpenLog) {
                        Log.e(Companion.TAG, "onNext: $classname\n$string")
                    }
                    val genericInterfaces = callBack::class.java.genericInterfaces
                    val parameterizedType = genericInterfaces[0] as ParameterizedType
                    val actualTypeArguments = parameterizedType.actualTypeArguments
                    val type = actualTypeArguments[0]
                    val fromJson = gson.fromJson<T>(string, type)
                    callBack.onSuccess(fromJson)
                }
            })
    }

    //post请求 请求头 有参
    fun <T> doPost(
        url: String, header: Map<String, Any>, map: Map<String, Any>, callBack: CallBack<T>
    ) {
        API.doPost(url, header, map).subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread()).subscribe(object : Observer<ResponseBody> {
                override fun onSubscribe(d: Disposable) {

                }

                override fun onError(e: Throwable) {
                    callBack.onError(e.toString())
                }

                override fun onComplete() {

                }

                override fun onNext(t: ResponseBody) {
                    val string = t.string()
                    if (isOpenLog) {
                        Log.e(Companion.TAG, "onNext: $classname\n$string")
                    }
                    val genericInterfaces = callBack::class.java.genericInterfaces
                    val parameterizedType = genericInterfaces[0] as ParameterizedType
                    val actualTypeArguments = parameterizedType.actualTypeArguments
                    val type = actualTypeArguments[0]
                    val fromJson = gson.fromJson<T>(string, type)
                    callBack.onSuccess(fromJson)
                }
            })
    }

    //上传图片
    fun <T> doFile(url: String, file: File, callBack: CallBack<T>) {
        val body = RequestBody.create(MediaType.parse("image/*"), file)//上传的文件
        val parts: List<MultipartBody.Part> =
            builder.setType(MultipartBody.FORM).addFormDataPart("file", file.name, body).build()
                .parts()
        API.upload(url, parts).subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread()).subscribe(object : Observer<ResponseBody> {
                override fun onSubscribe(d: Disposable) {

                }

                override fun onError(e: Throwable) {
                    callBack.onError(e.toString())
                }

                override fun onComplete() {

                }

                override fun onNext(t: ResponseBody) {
                    val string = t.string()
                    if (isOpenLog) {
                        Log.e(Companion.TAG, "onNext: $classname\n$string")
                    }
                    val genericInterfaces = callBack::class.java.genericInterfaces
                    val parameterizedType = genericInterfaces[0] as ParameterizedType
                    val actualTypeArguments = parameterizedType.actualTypeArguments
                    val type = actualTypeArguments[0]
                    val fromJson = gson.fromJson<T>(string, type)
                    callBack.onSuccess(fromJson)
                }
            })
    }

    //上传图片 请求头
    fun <T> doFile(url: String, header: Map<String, Any>, file: File, callBack: CallBack<T>) {
        val body = RequestBody.create(MediaType.parse("image/*"), file)//上传的文件
        val parts: List<MultipartBody.Part> =
            builder.setType(MultipartBody.FORM).addFormDataPart("file", file.name, body).build()
                .parts()
        API.upload(url, header, parts).subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread()).subscribe(object : Observer<ResponseBody> {
                override fun onSubscribe(d: Disposable) {

                }

                override fun onError(e: Throwable) {
                    callBack.onError(e.toString())
                }

                override fun onComplete() {

                }

                override fun onNext(t: ResponseBody) {
                    val string = t.string()
                    if (isOpenLog) {
                        Log.e(Companion.TAG, "onNext: $classname\n$string")
                    }
                    val genericInterfaces = callBack::class.java.genericInterfaces
                    val parameterizedType = genericInterfaces[0] as ParameterizedType
                    val actualTypeArguments = parameterizedType.actualTypeArguments
                    val type = actualTypeArguments[0]
                    val fromJson = gson.fromJson<T>(string, type)
                    callBack.onSuccess(fromJson)
                }
            })
    }

    //post请求 请求头 有参
    @SuppressLint("NewApi")
    fun doPostString(
        url: String, header: Map<String, Any>, map: Map<String, Any>, callBack: CallBack<String>
    ) {
        API.doPost(url, header, map).subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread()).subscribe(object : Observer<ResponseBody> {
                override fun onSubscribe(d: Disposable) {
                }

                override fun onError(e: Throwable) {
                    callBack.onError(e.toString())
                }

                override fun onComplete() {

                }

                override fun onNext(t: ResponseBody) {
                    val string = t.string()
                    if (isOpenLog) {
                        Log.e(Companion.TAG, "onNext: $classname\n$string")
                    }
                    callBack.onSuccess(string)
                }
            })
    }

    //post请求 RequestBody 请求头
    @SuppressLint("NewApi")
    fun <T> doPost(
        url: String, body: RequestBody, header: Map<String, Any>, callBack: CallBack<T>
    ) {
        API.doPost(url, body, header).subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread()).subscribe(object : Observer<ResponseBody> {
                override fun onSubscribe(d: Disposable) {

                }

                override fun onError(e: Throwable) {
                    callBack.onError(e.toString())
                }

                override fun onComplete() {

                }

                override fun onNext(t: ResponseBody) {
                    val string = t.string()
                    if (isOpenLog) {
                        Log.e(Companion.TAG, "onNext: $classname\n$string")
                    }
                    val genericInterfaces = callBack::class.java.genericInterfaces
                    val parameterizedType = genericInterfaces[0] as ParameterizedType
                    val actualTypeArguments = parameterizedType.actualTypeArguments
                    val type = actualTypeArguments[0]
                    val fromJson = gson.fromJson<T>(string, type)
                    callBack.onSuccess(fromJson)
                }
            })
    }

    interface ApiService {

        @POST
        @FormUrlEncoded
        fun doPost(@Url url: String, @FieldMap map: Map<String, Any>): Observable<ResponseBody>

        @GET
        fun doGet(@Url url: String, @QueryMap map: Map<String, Any>): Observable<ResponseBody>

        @GET
        fun doGet(@Url url: String): Observable<ResponseBody>

        @GET
        fun doGetArray(@Url url: String): Observable<ResponseBody>

        @POST
        @FormUrlEncoded
        fun doPost(
            @Url url: String,
            @HeaderMap headerMap: Map<String, Any>,
            @FieldMap map: Map<String, Any>
        ): Observable<ResponseBody>

        @GET
        fun doGet(
            @Url url: String,
            @HeaderMap headerMap: Map<String, Any>,
            @QueryMap map: Map<String, Any>
        ): Observable<ResponseBody>

        @Multipart
        @POST
        fun upload(
            @Url url: String, @Part partList: List<MultipartBody.Part>
        ): Observable<ResponseBody>

        @Multipart
        @POST
        fun upload(
            @Url url: String,
            @HeaderMap headerMap: Map<String, Any>,
            @Part partList: List<MultipartBody.Part>
        ): Observable<ResponseBody>

        @POST
        fun doPost(
            @Url url: String, @Body body: RequestBody, @HeaderMap headerMap: Map<String, Any>
        ): Observable<ResponseBody>

        @POST
        @FormUrlEncoded
        fun doPost(@Url url: String): Observable<ResponseBody>

    }

    private fun setClassName(name: String): RetrofitUtils? {
        this.classname = name
        return instance
    }

    //是否显示log
    private fun isOpenLog(isOpenLog: Boolean): RetrofitUtils? {
        this.isOpenLog = isOpenLog
        return instance
    }




    object GetParameter{
        private val h = HashMap<String, Any>()
        private val p = HashMap<String, Any>()
        //参数集合 手动添加
        fun parameter(): HashMap<String, Any> {
            clearPMap()
            return p
        }
        fun header(): HashMap<String, Any> {
            clearHMap()
            return h
        }
        fun header(appId: String, version: String): HashMap<String, Any> {
            clearHMap()
            h["appId"] = appId
            h["version"] = version
            return h
        }

        //请求头集合 key通过“,”拼接 如果是String以外的数据类型 需要手动添加对应方法 或者进行转换
        fun header(key: String, vararg parameter: String): HashMap<String, Any> {
            clearHMap()
            val split = key.split(",")
            for (i in split.indices) {
                h[split[i]] = parameter[i]
            }
            return h
        }

        //参数集合 key通过“,”拼接 如果是String以外的数据类型 需要手动添加对应方法 或者进行转换
        fun parameter(key: String, vararg parameter: String): HashMap<String, Any> {
            clearPMap()
            val split = key.split(",")
            for (i in split.indices) {
                p[split[i]] = parameter[i]
            }
            return p
        }

        //清空参数集合
        private fun clearPMap() {
            if (p.size > 0) {
                p.clear()
            }
        }

        //清空请求头集合
        private fun clearHMap() {
            if (h.size > 0) {
                h.clear()
            }
        }
    }

    //数据返回回调方法
    interface CallBack<T> {
        fun onSuccess(bean: T)

        fun onError(error: String)
    }

    //返回数据是数组,回调方法
    interface ArrayCallBack {
        fun onSuccess(responseBody: String)

        fun onError(error: String)
    }

    //拦截器
    class LoggingInterceptor : Interceptor {
        companion object {
            private const val TAG = "LoggingInterceptor"
        }


        override fun intercept(chain: Interceptor.Chain): Response {
            //获取请求数据
            val request = chain.request()
            //1.请求前--打印请求信息
            val startTime = System.nanoTime()
            Log.d(
                TAG, String.format(
                    "Sending request %s on %s%n%s",
                    request.url(),
                    chain.connection(),
                    request.headers()
                )
            )
            //2.网络请求
            val response = chain.proceed(request)
            //3.网络响应后--打印响应信息
            val endTime = System.nanoTime()
            Log.d(
                TAG, String.format(
                    "Received response for %s in %.1fms%n%s",
                    response.request().url(),
                    (endTime - startTime) / 1e6,
                    response.headers()
                )
            )
            return response
        }
    }

}

调用方法

主方法

主要是网络解析添加参数,然后获取到请求回调的方法

//getInstance("") 中参数为请求的主路径
//后面方法中的url 为绝对路径
//例如http://www.goole.com/wp-login  主路径为www.goole.com/ 绝对路径为 wp-login
RetrofitUtils.getInstance("").doGet("",object :RetrofitUtils.CallBack<String>{
            override fun onSuccess(bean: String) {
                TODO("Not yet implemented")
            }

            override fun onError(error: String) {
                TODO("Not yet implemented")
            }
        })

拓展方法

设置请求参数

通过可变参数,可以实现多参数添加

 		val parameter = RetrofitUtils.GetParameter.parameter("1,2,3", "2", "3", "1")

        val parameter = RetrofitUtils.GetParameter.parameter()
        parameter["1"] = "1"

设置请求头

与请求参数相同,作为http请求的请求头设置到请求中

		val header = RetrofitUtils.GetParameter.header("1,2,3", "2", "3", "1")

        val header = RetrofitUtils.GetParameter.header()
        header["1"] = "1"
  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值