Retrofit 是 square 的一个网络请求框架,本文记录Retrofit的学习笔记
Retrofit
请求框架将网络请求逻辑和业务逻辑分离,使得我们更关注于服务本身
首先,声明一个接口,接口中的每个函数都可以是一个请求描述
interface GankIOServiceI {
@GET("data/{type}/{size}/{page}")
fun getDataByPage(@Path("type") type: String, @Path("size") size: Int, @Path("page") page: Int): Call<ResponseBody>
}
-
@GET
注解标识使用get
请求,需要传入一个请求路径,最后的服务地址是http://baseUrl\请求路径
,请求路径可以使用字符串模板{xxx}
-
@Path
注解的参数用于替换请求路径中的字符串模板 - 更多注解可以参考官方说明文档
接着,使用接口进行网络访问
fun main(vararg args:String) {
//创建一个Retrofit对象,使用gank.io的api
var retrofit = Retrofit.Builder().baseUrl("http://gank.io/api/").build()
// retrofit对象使用动态代理机制生成接口的代理类
var gankIO = retrofit.create(GankIOServiceI::class.java) as GankIOServiceI
//直接发起网络请求
var response = gankIO.getDataByPage("Android", 10, 1).execute()
println(response.body()?.string())
//异步发起网络请求,内部维护了一个线程池
gankIO.getDataByPage("Android", 10, 1).enqueue(object : Callback<ResponseBody> {
override fun onFailure(p0: Call<ResponseBody>?, p1: Throwable?) {
}
override fun onResponse(p0: Call<ResponseBody>?, p1: Response<ResponseBody>?) {
System.out.println(p1?.body()?.string())
}
})
}
加入json转换并和rxjava结合
首先声明entity:
class ResponseMsg<T> {
var error: Boolean? = null
var results: List<T>? = null
}
class Msg {
var _id: String? = null
var desc: String? = null
var publishedAt: String? = null
var source: String? = null
var type: String? = null
var url: String? = null
var used: Boolean? = null
var who: String? = null
}
修改接口方法:
interface GankIOService {
@GET("data/{type}/{size}/{page}")
fun getDataByPage(@Path("type") type: String, @Path("size") size: Int, @Path("page") page: Int): Observable<ResponseMsg<Msg>>
}
发起请求:
fun main(vararg args: String) {
var retrofit = Retrofit
.Builder()
.baseUrl("http://gank.io/api/")
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build()
var gankIO = retrofit.create(GankIOService::class.java) as GankIOService
gankIO.getDataByPage("Android", 10, 1).flatMap {
Observable.from(it.results)
}.map {
it.desc
}.subscribe {
println(it)
}
}
网友评论