Retrofit源码分析总结
2021-06-28 本文已影响0人
QM
Retrofit怎么进行网络请求
Retrofit主要是在create方法中采用动态代理模式实现接口方法,这个过程构建了一个ServiceMethod对象,根据方法注解获取请求方式,参数类型和参数注解拼接请求的链接,当一切都准备好之后会把数据添加到Retrofit的RequestBuilder中。然后当我们主动发起网络请求的时候会调用okhttp发起网络请求,okhttp的配置包括请求方式,URL等在Retrofit的RequestBuilder的build()方法中实现,并发起真正的网络请求。
Retrofit使用方法
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(hostUrl)
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.client(OkHttpClient())
.build();
ApiService apiService = retrofit.create(ApiService.class)
Call<ResponseBody> call = ApiService .getInfo("codeqm");
//同步请求方式
call.request();
//异步请求方式
call.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
//请求成功回调
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
//请求与失败回调
}
});
Retrofit
Retrofit的具体实现原理梳理总结:
- 使用构建模式创建Retrofit实例对象
- 使用动态代理模式,通过Retrofit实例对象的create方法动态创建网络请求接口的代理类
- 使用代理类调用方法发起网络请求时,会通过CallAdapterFactory创建的CallAdapter对象的adapt方法调用OkHttpCall的enqueue方法发起网络请求
- OkHttpCall的enqueue方法先根据注解、请求参数等信息构建出OkHttpClient的网络请求Call对象,接着使用Call对象发起网络请求
- 网络请求回来时,使用ServiceMethod的toResponse方法中调用响应内容适配器的具体实现类的convert发放进行解析
- Retrofit只是对网络请求进行封装的一个框架,它本身并不发起网络请求,为的是方便我们使用、优化我们网络请求的代码、对网络请求进行扩展(可以自定义请求适配器、响应内容解析器等)。
使用Retrofit需要注意一下细节:
- 必须要要配置baseUrl
- 定义网络请求必须是接口不能是类,且不能继承其他的接口
- 定义网络请求接口时,必须要遵循Retrofit的语义规则,比如:@GET对应@Query;@FormUrlEncoded对应@Field;@Multipart对应@Part等
- 如果配套使用Rxjava,则必须遵循RxJava语义
- 对应OkHttp头部的key不能null也不能为空字符串;value不能为null
参考链接:
https://zhuanlan.zhihu.com/p/35121326
https://www.jianshu.com/p/8512454df047
https://www.jianshu.com/p/f57b7cdb1c99