前言
原计划是将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转化成Rxjava的Observable或其他类型
.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
}
}