【一起学习Android开源框架】Retrofit的简单使用(第一部分)

1,501

前言

Retrofit是Square公司开发的一款HTTP框架,主要用于Android和Java;Retrofit会把所有http网络请求API变成java的接口,使用起来简洁方便,下面我们一起开始学习Retrofit的使用流程和原理以及相关源码分析;

Retrofit简介

Retrofit又称为Restful Http网络请求框架的封装,值得注意的是,它仅仅是对网络请求框架的封装,可以说本身并不是一个框架,工作也不是本身来做的,现在Retrofit2底层是基于Okhttp来实现的,所以本职工作还是由它的内核Okhttp来完成

可以看下这张解析的流程图

retrofitStart.png

  • 我们的应用程序Application层,通过Retrofit层来封装请求参数,url以及相关配置信息
  • 再通过Okhttp层来完成后续的请求操作
  • 在服务端返回数据之后给Okhttp层,Okhttp层又会将原始结果交给Retrofit层,最后在通过Retrofit层返回给应用层,这就是解析的过程

简单来说,让Retrofit专注于接口封装工作,让Okhttp专注于网络请求高效操作,两者分工合作,更能提高效率

简单总结

  • APP应用程序通过Retrofit请求网络,实际上是使用了Retrofit接口层封装请求参数(头部,url,请求消息等等),之后由Okhttp完成后续的请求操作
  • 在完成服务端返回数据之后,Okhttp将原始的结果交给Retrofit,Retrofit根据用户的需求对结果进行解析
  • 可以这么说,它的主要作用就是封装我们底层网络框架OkHttp,完成各种数据转化和适配工作,而这些从而导致了Retrofit使用很多设计模式,意味着也有很好的扩展性,无缝适配那些主流的类似Okhttp,Rxjava库等等

Retrofit简单使用

看完上面的介绍,是不是感觉Retrofit非常强大,这也是现在很多项目都使用Retrofit的主要原因.下面我通过官方给出的例子结合自己给出的例子,来简单聊聊Retrofit的使用.

官网给出的例子

  1. 第一步定义一个GithubService接口
interface GithubService {

    @GET("user/{user}/repos")
    fun listRepos(@Path("user") user: String): Call<List<Repo>>
    
}
  • 这里的listRepos方法定义了一个Get注解,表示这个是一个Get请求,在Get注解中的字符串写入我们请求的路径,这里和后面的BaseUrl拼接起来就是一个完整的url
  • 然后在字符串中有个**{user}**,这里的值是动态变化的,是由listRepos方法传递过来的
  • 我们看下方法里参数里加了个注解@Path,如果我们传递过来的字符串user为空的话,就默认使用path中的字符串来作为url地址的默认值
  1. 创建我们Retfrofit请求
 val retrofit = Retrofit.Builder()
            .baseUrl("https://api.github.com/")
            .addConverterFactory(GsonConverterFactory.create())
            .build()
val service = retrofit.create(GithubService::class.java)
  • 使用构建者模式,然后我们传入一个baseurl基础路径
  • 调用addConvertFactory方法,基本作用就是将我们返回的httpResponse转换成java对象,用于渲染在ui上面,这个在后面源码会继续分析
  • 调用build()方法完成retrofit配置
  • 通过retrofit调用create方法创建GtihubService的实例,传入它的字节码
  1. 调用接口中的方法,通过okhttp来执行网络请求
val repos: Call<List<Repo>> = service.listRepos("octocat")


        repos.enqueue(object : Callback<List<Repo>> {
            override fun onResponse(call: Call<List<Repo>>, response: Response<List<Repo>>) {
                TODO("Not yet implemented")
            }

            override fun onFailure(call: Call<List<Repo>>, t: Throwable) {
                TODO("Not yet implemented")
            }

        })
  • 从这里可以看出了,retrofit真正的网络请求工作还是交给Okhttp去做的,上面使用的是enqueue()异步请求,关于同步和异步后面会详细解析

自己使用的简单例子

这里我大致把retrofit网络请求过程分成了6个步骤

  1. 第一个步骤,添加retrofit库的依赖,增加网络权限
  //retrofit
    implementation 'com.squareup.retrofit2:retrofit:2.9.0'
    implementation 'com.squareup.retrofit2:converter-gson:2.3.0'
    implementation 'com.squareup.retrofit2:adapter-rxjava:2.3.0'
  1. 第二个步骤,创建实体类用于接收服务器返回的Bean类型
class MyResponse(
    name: String,
    age: Int,
    color: String,
    address: String
)
  1. 第三个步骤,创建一个用于描述网络请求的接口
interface MyInterface{
    @GET(".../...")
    fun getCall():Call<List<MyResponse>>

}
  • retrofit将每一个http请求抽象成了java接口,采用注解模式描述和配置整个网络请求
  • retrofit的注解内部机制是通过动态代理模式(这里不详细解析了)将整个注解翻译成了一个个http请求
  1. 第四个步骤,开始创建retrofit,添加相关配置
        val retrofit = Retrofit.Builder()
            .baseUrl("http://xxx.xxx.com/") //设置网络请求的url地址
            .addConverterFactory(GsonConverterFactory.create()) //设置数据解析器
            .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) //支持Rxjava平台
            .build()
  • 这里我们增加了两个参数,先来看ConvertFactory,其实就是数据解析器,retrofit不仅仅支持Gson,类似json,protobuf都支持,所以这里添加转换器的工厂,值得注意的是,每次使用不同的数据解析,都需要在gradle添加相应的依赖
  • 同时,retrofit也支持多种网络请求适配方式,如果使用的是Android默认的CallAdapter,就不需要添加网络请求适配器的依赖
  1. 第五个步骤,创建网络请求接口的实例
val myInterface = retrofit.create(MyInterface::class.java)
val call = myInterface.getCall()
  • retrofit调用create方法创建MyInterface的实例,传入接口的字节码文件
  • 创建好之后,调用接口中的**getCall()**方法获取Call的实例(Okhttp中的实际请求)
  1. 第六个步骤,进行实际的网络请求(调用enqueue进行异步请求或者execute进行同步请求)
 call.enqueue(object : Callback<List<MyResponse>>{
            override fun onResponse(
                call: Call<List<MyResponse>>,
                response: Response<List<MyResponse>>
            ) {
               println(response.body())
            }

            override fun onFailure(call: Call<List<MyResponse>>, t: Throwable) {
                println("请求失败")
            }

        })

以上就是一个完整的Retrofit请求

总结

综合来说,我们已经了解Retrofit的简单使用,大致如下:

  • 添加Retrofit库的依赖,添加网络权限
  • 创建接收服务器返回数据的类
  • 创建用于描述网络请求的接口
  • 创建Retroifit实例(建造者模式)
  • 创建网络请求接口实例
  • 发送网络请求(异步/同步)
  • 处理服务器返回的数据

这就是Retrofit简单的使用流程,熟悉了以上这些,下面和同学我一起进入Retrofit的源码世界一探究竟吧,解析学习Retrofit的内部机制是如何实现的

未完待续