1. 介绍
Retrofit主要是基于OKHttp进一步封装的网络请求的框架。它采用了一种接口方法声明请求的方式,使用方法注解和方法参数注解进行标记请求信息,通过动态代理访问接口方法并解析Method,最后将请求信息汇总组装成okhttp3.Request对象,再根据接口方法返回值类型决定调用适配器(CallAdapter),内部通过okhttp3.Call.enqueue(..) 或okhttp3.Call.execute() 同步/异步请求,请求响应后通过转换器(Converter)把okhttp3.ResponseBody数据再进行一次转换得到最后的数据。
2.suspend 关键字,Kotlin 协程方式使用
接口方法标记为suspend,会把返回类型T 包装成Call
3.CallAdapter实现类介绍
RxJava2CallAdapterFactory
.create(isAsync);//isAsync = true or false来判断是否是异步或同步请求。默认是同步请求也就是false。- 默认的CallAdapter实现类
DefaultCallAdapterFactory
:Call<T>类型的,调用同步(execute)或异步(enqueue)。
CompletableFutureCallAdapterFactory
:CompletableFuture<T>类型的,使用异步(enqueue)。
4.用法
这一小节通过一系列不同请求方式的代码来展示相关的用法。
主要分为6个文件,具体代码文件在最后面。
- ServiceInterface.kt 声明接口请求
- Main.kt 测试接口请求
- ApiConverterFactory.java 转换器工厂类
- ApiRequestBodyConverter.java 转为RequestBody对象转换器类 (@Part 参数对象转为RequestBody)
- ApiResponseBodyConverter.java ResponseBody对象转换器类
- HttpBinResponse.java ResponseBody装好后的数据类
4.1 基本用法
- 1.GET 请求下载文件
- 2.GET 请求
- 3.GET 请求 查询?name=value
- 4.GET 请求 查询?name
- 5.POST 请求
- 6.POST 请求 表单数据提交 name=”名字”&content=”内容”
- 7.POST 请求 多部分表单提交 multipart/form-data
4.2 进阶用法
- 1.通过@URL 请求一个不同地址的URL
- 2.通过Interceptor拦截器,实现动态设置不同BaseUrl
5. 源码具体示例分析
这一小节,通过一个post表单提交梳理下执行流程。以下是这个post请求的代码:分为三部分
- 1.接口请求声明部分
- 2.Retrofit类构建,并返回接口的实现类部分
- 3.接口请求测试部分
1 | interface ServiceInterface { |
从sServiceInterface.post("名字","内容").execute();
开始分析
1.先看看sServiceInterface
是怎么创建的?
2.再看看调用post("名字","内容")
方法是怎么回事?
3.最后看下执行execute()
是怎么样的?
开始分析1.
1 | //先进入Retrofit#create(..)方法 |
开始分析2.
从上一步的loadServiceMethod(method).invoke(args)
开始分为2个部分:
- 2.1
loadServiceMethod(method)
- 2.2 调用
invoke(args)
方法
开始分析2.1 loadServiceMethod(method)
1 | //从Retrofit#loadServiceMethod(..)开始 |
开始分析 2.2 调用invoke(args)
方法
1 | /**CallAdapted中没有invoke方法,invoke方法的实现位于它的父类HttpServiceMethod中**/ |
开始分析3.
1 | //从上一步最后返回ExecutorCallbackCall对象,开始分析 |
总结
sServiceInterface.post("名字","内容").execute();
- 1.
sServiceInterface
通过Proxy.newProxyInstance(..)动态代理获取接口ServiceInterface代理对象。 - 2.调用
post("名字","内容")
方法时,开始执行动态代理内部方法,通过层层解析返回ExecutorCallbackCall类,其中包含OkHttpCall对象变量,OkHttpCall中主要包含了一些okhttp3.Request、okhttp3.Call.execute()等处理。 - 3.执行
execute()
,最后就是执行了okhttp3.Call.execute()。
其他
- 1.对于super和extends的上界下界:
List<? super Food> 表示Food的超类,说明Food是?的下界 (只能add,不能get)
List<? extends Fruit> 表示Fruit的子类,说明Fruit是?的上界 (只能get,不能add)
class Food{}
class Fruit extends Food {}
6. 附录
【4】用法示例源码
1 | interface ServiceInterface { |
1 | public class Main { |
1 | public class ApiConverterFactory extends Converter.Factory{ |
1 | public class ApiRequestBodyConverter implements Converter<File, RequestBody> { |
1 | public class ApiResponseBodyConverter implements Converter<ResponseBody, HttpBinResponse> { |
1 | public class HttpBinResponse { |