Retrofit是有Square公司开发的用于android和java的类型安全的Http客户端。
github地址 https://github.com/square/retrofit
Retrofit是针对android/java平台,基于okhttp的、采用方法注解和动态代理的方式来实现的类型安全的网络请求框架。
Retrofit 有众多的优点,简单、高效、方便、易扩展、已维护等。
因为retrofit是基于okhttp的,所以retrofit本身并不做网络请求,retrofit主要作用是根据我们定义的接口方法及注解信息生成一个用于触发网络请求的Call对象的,这个Call对象又关联一个底层okhttp3的Call对象,用于真正执行网络请求的。
Retrofit主要包括四个部分:
- 业务层接口定义,主要是定义业务层访问服务器端的API接口类。然后给接口中的方法提供方法注解,用来指定http的请求方式、url、编码方式、header信息及参数类型等,用于后面封装Request请求。
- 创建Retrofit实例,Retrofit通过Retrofit.Builder类构建retrofit实例,builder类可以设置base url、 CallAapterFactory、ConverterFactory、OkHttpClient等信息。
- 通过Retrofit实例将http API 接口转换为java接口,并获取执行http请求的Call对象。Retrofit通过调用create()方法来创建我们定义的接口实例,这个过程是通过动态代理来实现的,最终代理类中每个方法都会调用到InvocationHandler对象的invoke()方法。invoke()方法会返回一个用于执行http请求的call对象。而这个call对象内部又引用了okhttp3.call对象,用于最终执行http请求。在invoke方法内部retrofit会根据invoke方法传入参数中的Method对象、返回数据类型及方法的参数列表等信息创建一个ServiceMethod对象,ServiceMethod对象的主要作用有两个: (1)是解析Method对象的注解信息获取接口的请求方式、url、header信息及method参数等信息生成一个用于http请求的Request对象。(2)是通过CallAdpterFactory将OkhttpCall对象转换成接口中定义的Call对象。
- 拿到Retrofit.create()方法返回的Call对象后,就可以调用Call对象的excute()方法或enqueue()方法执行同步或异步请求。因为Call对象内部引用了OkHttp3.Call对象,所以最后会调用到OkHttp3.Call对象的excute()或enqueue()方法执行网络请求。在android里面我们通常会用异步执行网络请求,当结果返回后refrofit会通过ConverterFactory将结果转换为我们上层业务层所需的数据类型并通过handler将转换后的结果发送到主线程中。然后我们可以拿到接口数据做些跟UI相关的操作。
retrofit提供了相关的可扩展操作:
(1)在创建retrofit时我们可以对callAdapter进行扩展,提供自定义callAdapter,默认情况下retrofit内置了callAdapter对象,如果我们要使用Rxjava的话,我们可以提供一个RxJavaCallAdapter即可,也可以根据实际情况实现CallAdapter接口自定义一个callAdapter。
(2)其次在设置ConverterFactory时,因为retrofit没有内置converter所以必须提供一个ConverterFactory,除了GsonConverterFactory外,还可以设置JacksonConvertorFactory、SimpleXmlConvertorFactory等。
(3)对于网络请求框架OkhttpClient尽管不能替换成其他的网络请求框架,但我们可以新创建一个OkhttpClient对象自行配置相关参数,如:读写缓存、超时时间、添加多个拦截器等。