网络请求开源库Retrofit


一、Retrofit是什么?

Retrofit是由Square公司开发的网络库,是从okHttp的基础上进一步开发的实用层网络通信库。因为它内部网络请求的工作,本质上是通过OkHttp完成,而Retrofit仅负责网络请求接口的封装。

二、使用步骤(按网络层架构书写)

1.引入依赖库

	implementation 'com.squareup.retrofit2:retrofit:2.6.1'
    implementation 'com.squareup.retrofit2:converter-gson:2.6.1'

2.创建相应的数据实体类

class PlaceResponse(val status: String, val places: List<Place>)

class Place(val name: String, val address: String)

3.创建相应网络请求接口

interface PlaceService{

	//采用注解描述网络请求参数和配置网络请求参数
	//searchPlaces()的方法的返回值必须声明成Retrofit内置的Call类型,并通过泛型来指定服务器响应的数据应该是什么对象
    @GET("place?lang=zh_CN")
    fun searchPlaces(@Query("query") query: String): Call<PlaceResponse>
}

常用网络请求方法:
@GET(请求服务器获取数据)
@POST(请求用于向服务器提交数据)
@PUT和@PATCH(用于修改服务器上的数据)
@DELETE(删除服务器上的数据)

//这里的url为Retrofit实例时通过baseUrl设置 +网络请求接口的注解设置
//baseurl=http://Exampie.com/
//在GET注解指定的接口地址当中,这里使用了一个{page}的占位符,然后又在getData()准中添加了一个 page 参数,并使用@Path( "page")注解来声明这个参数。
//这样当调用getData()方法发起请求时,Retrofit就会自动将page参数的值替换到占位符的位置,从而组成个合法的请求地址。

例子:GET http://Exampie.com/<page>/get_data.json
interface GetService {
	@GET("{page}/get_data.json")
	fun getData(@Path(page") page: Int): Call<Data>
}
例子:GET  http://example.com/get_data.json?u=<user>
interface ExampleService {
	//Ouery注解对它们进行声明,当发起网络请求Retrofit会自动按照带参数GET请求的格式将参数构建到请求地址
	@GET ("get_data.json")
	fun getData(@Query("u") user: String,): Call<Data>
}
例子:DELETE http://Exampie.com/<page>/get_data.json
//由于 POST、PUT 、PATCH、DELETE 这几种请求尖型与GEI请求不同,它们更多是用于操作服务器上的数据
//这个时候就可以使用 ResponseBody,表示Retrofit能够接收任意类型的响应数据,并且不会对响应数据进行解析。
interface Exampleservice {
	@DELETE("{page}/get_data.json")
	fun deleteData(@Path("path") path: String): Call<ResponseBody>
}
例子:POST http://example.com/data/create
{"id":1,"content" : "The description for this data."}
//使用 POST请求来提交数据,需要将数据放到HTTP请求的body部分,这个功能在Retrofit中可以借助@Body注解来完成
//这种写法同样也可以用来给PUT、PATCH、DELETE 类型的请求提交数据。
interface ExampleService{
	@POST( ""data/create")
	fun createData(@Body data: Data) : call<ResponseBody>
}

4.创建Retrofit构建器

object ServiceCreator{

    private const val BASE_URL="https://api.caiyunapp.com/"

    private val retrofit=Retrofit.Builder()
        .baseUrl(BASE_URL)
        .addConverterFactory(GsonConverterFactory.create())
        .build()

    fun <T> create(serviceClass:Class<T>):T= retrofit.create(serviceClass)
	//这里通过泛型实例化优化create()方法
    inline fun <reified T> create():T= create(T::class.java)
}

5.创建网络数据源访问入口

object SunnyWeatherNetwork {
    private val placeService=ServiceCreator.create(PlaceService::class.java)
    
    suspend fun searchPlaces(query: String)= placeService.searchPlaces(query).await()

	//用协程优化Retrofit回调
    private suspend fun <T> Call<T>.await():T{
        return suspendCoroutine { continuation ->
            enqueue(object :Callback<T>{
                override fun onResponse(call: Call<T>, response: Response<T>) {
                    val body=response.body()
                    if (body!=null) continuation.resume(body)
                    else continuation.resumeWithException(RuntimeException("response body is null"))
                }

                override fun onFailure(call: Call<T>, t: Throwable) {
                    continuation.resumeWithException(t)
                }
            })

        }
    }
}

总结

这只是我对于Retrofit的小小认识,有不足之处还请指点。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值