Retrofit源码分析总结

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 call = ApiService .getInfo("codeqm");

//同步请求方式
 call.request();
 //异步请求方式
 call.enqueue(new Callback() {
            @Override
            public void onResponse(Call call, Response response) {
                //请求成功回调
            }

            @Override
            public void onFailure(Call 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

你可能感兴趣的:(Retrofit源码分析总结)