Kotlin之Retrofit的使用

前言


原计划是将Retrofit封装便于项目调用接口,无奈我所调用的接口返回结构过于复杂,要想将封装做到完善必须与实际的业务和后台对接。

这篇虎头蛇尾的文章权当为后面的业务打基础。

正文


我所使用的接口是开眼项目中的发现栏(有兴趣的可以在应用市场下载,一款很不错的app)

GET 请求
http://baobab.kaiyanapp.com/api/v5/index/tab/discovery

对此地址进行请求可以看到庞大的json,以我的理解先讲下

复杂的原因:
1、界面结构由返回的json构成;
2、由于第1点导致返回的json量特别大,乍一看结构很复杂;

结构:
json返回的数据中有一个列表,列表中的每一项(每项结构并不相同,这里是理解其json的关键)对应一个自定义控件,根据返回的json实例化控件并添加到视图。

优点:
移动端只需要自定义好相应的控件,至于如何摆放、控件的内容全权交由后台来控制。

复杂归复杂,其终究还是一个返回json的接口,回归主题对Retrofit进行封装,至于解析json的工作再另行记录。

使用前

    compile 'com.squareup.retrofit2:retrofit:2.3.0'
    //转换json  挂代理的小心,即使关闭代理可能也会报错。关闭代理后重启AS,估计是AS3.0的bug
    compile 'com.squareup.retrofit2:converter-gson:2.3.0'

请求的主类:

class Requester {

    companion object {

        private fun <T> getService(baseUrl: String, service: Class<T>): T {

            var clien = OkHttpClient.Builder()
                    //自定义拦截器用于日志输出
                    .addInterceptor(LogInterceptor())
                    .build()

            val retrofit = Retrofit.Builder().baseUrl(baseUrl)
                    //格式转换
                    .addConverterFactory(GsonConverterFactory.create())
                    //正常的retrofit返回的是call,此方法用于将call转化成RxjavaObservable或其他类型
                   .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                    .client(clien)
                    .build()
            return retrofit.create(service)
        }

        //可用于多种不同种类的请求
        fun apiService(): ApiService {
            return getService(ApiService.baseUrl, ApiService::class.java)
        }

    }

}
interface ApiService {

    companion object {
        //此类接口的基地址
        val baseUrl = "http://baobab.kaiyanapp.com/"
    }

    //请求类型 + 路由
    @GET("api/v5/index/tab/discovery")
    fun getTabDiscovery(): Call<ResponseBody>//由于json采用手动解,所以没有用泛型

}
class LogInterceptor : Interceptor {

    val tag = "Retrofit"
    val format = SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS")

    override fun intercept(chain: Interceptor.Chain): Response {

        var request = chain.request()

        Logger.i(tag, format.format(Date()) + " Requeste " + "\nmethod:" + request.method() + "\nurl:" + request.url() + "\nbody:" + request.body())

        var response = chain.proceed(request)

        //response.peekBody不会关闭流
        Logger.i(tag, format.format(Date()) + " Response " + "\nsuccessful:" + response.isSuccessful + "\nbody:" + response.peekBody(1024)?.string())

        return response
    }

}

猜你喜欢

转载自blog.csdn.net/s1991721/article/details/79007860