【无标题】

前言

本文主要记录第一行代码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)
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值