前言
本文主要记录第一行代码11.6节Retrofit的使用
一、Retrofit简介
Retrofit是Square公司开发的网络库,但是与OkHttp定位不同
Retrofit:侧重上层接口的封装(实际上是在OkHttp的基础上进一步开发出来的应用擦鞥网络通信库)
OkHttp:侧重底层通信实现
二、使用步骤
1.引入库
dependencies{
...
implementation 'com.squareup.retrofit2:retrofit:2.6.1'
implementation 'com.squareup.retrofit2:converter-gson:2.6.1'
}
第一条依赖会自动将Retrofit和OkHttp和Okio这几个库一起下载
第二条依赖是一个Retrofit转换库,它借助Gson来解析JSON数据,会自动将GSON库一起下载
2.Retrofit处理复杂的接口地址类型
首先为了方便定义一个Data类:
class App(val id: String, val name: String, val version: String)
class Data(val id: String, val content: String)
(1)静态地址类型
GET http://example.com/get_data.json
interface AppService{
@GET("get_data")
fun getAppData(): Call<List<App>>
}
class MainActivity: AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?){
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
getAppDataBtn.setOnClickListener{
val retrofit = Retrofit.Builder()
.baseUrl("https://example.com")
.addConverterFactory(GsonConverterFactory.create())
.build()
val appService = retrofit.create(AppService::class.java)
appService.getAppData().enqueue(object : Callback<List<App>>{
override fun onResponse(call: Call<List<App>>,
response: Response<List<App>>){
val list = response.body
if (list != null) {
//....
}
}
override fun onFailure(call: Call<List<App>>, t: Trowable){
t.printStackTrace()
}
}
}
}
}
(2)动态地址类型
1.地址的路径中存在动态变化的页码
GET http://example.com/<page>/get_data.json
此处接口中需要传入页数,那么写法就是在GET注解中加入一个{page}占位符,在方法中使用@Path("page")注解来声明这个参数。这样当调用getData()方法时,Retrofit就会自动将page参数的值替换到占位符的位置。
interface ExampleService{
@GET("{page}/get_data.json")
fun getData(@Path("page") page: Int): Call<Data>
}
2.地址中需要传入不同的参数
GET http://example.com/get_data.json?u=<user>&t=<token>
这种情况使用Path注解比较麻烦,此处接口中有user和token两个参数需要传入,Retrofit使用@Query("u")/@Query("t")对接口地址的参数进行构建。(不变的参数仍要写在@GET注解中)
interface ExampleService{
@GET("get_data.json")
fun getData(@Query("u") user: String, @Query("t") token: String): Call<Data>
}
(3)其他请求类型
POST PUT PATCH DELETE
retrofit都有对应的注解
3.Retrofit构建器最佳写法
object ServiceCreator{
private const val BASE_URL = "http://10.0.2.2/"
private val retrofit = Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build()
fun <T> create(serviceClass: Class<T>): T = retrofit.create(serviceClass)
inline fun <reified T> create(): T = create(T::class.java)
}