前言
原計劃是將Retrofit封裝便于項目調用接口,無奈我所調用的接口返回結構過于復雜,要想將封裝做到完善必須與實際的業(yè)務和后臺對接咽扇。
這篇虎頭蛇尾的文章權當為后面的業(yè)務打基礎。
正文
我所使用的接口是開眼項目中的發(fā)現(xiàn)欄(有興趣的可以在應用市場下載,一款很不錯的app)
GET 請求
http://baobab.kaiyanapp.com/api/v5/index/tab/discovery
對此地址進行請求可以看到龐大的json佳遣,以我的理解先講下
復雜的原因:
1、界面結構由返回的json構成凡伊;
2零渐、由于第1點導致返回的json量特別大,乍一看結構很復雜系忙;
結構:
json返回的數(shù)據(jù)中有一個列表诵盼,列表中的每一項(每項結構并不相同,這里是理解其json的關鍵)對應一個自定義控件银还,根據(jù)返回的json實例化控件并添加到視圖风宁。
優(yōu)點:
移動端只需要自定義好相應的控件,至于如何擺放蛹疯、控件的內容全權交由后臺來控制戒财。
復雜歸復雜,其終究還是一個返回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
}
}