Retrofit源码解析(一)

2017-11-21  本文已影响143人  andcoder

一、什么是Retrofit

A type-safe HTTP client for Android and Java

以上是官网给出的答案,翻译成中文:Retrofit是Android和Java上类型安全的http客户端。

简而言之,Retrofit是对http网络请求框架的封装,与Volley\AsyncHttpClient等类似,简化了用户的http请求流程。

它支持DELETE\GET\POST\PUT\HEADER\OPTION\PATCH等请求方式,默认使用okhttp作为网络请求引擎。

二、Retrofit的一些重要类及接口

该接口代表一个实际的http请求,它的主要作用有三个:

  1. 调用createRawCall创建请求;
  2. 调用okhttp发送请求;
  3. 将okhttp返回的响应解析成Retrofit对应的Response
  4. 对于异步的enqueue操作,还有执行相应的onResponse和onFailure回调操作

抛开mock测试相关,该类的实现类主要有:OkHttpCall\ExecutorCallbackCall。


顾名思义,该接口的主要作用是适配,将一个带有响应类型为R的Call请求适配成需要的类型T。所以该接口的定义是CallAdapter<R,T>。其核心方法T adapt(Call<R> call)的作用就在于此。

该类内部还封装了一个抽象工厂类Factory。通过Retrofit.create会产生一个接口对象,该接口对象内部的方法的返回值都具有返回类型。Factory正是用于创建基于该返回类型而生的CallAdapter。

抛开mock测试相关,CallAdapter的实现类主要有:BodyCallAdapter\ResponseCallAdapter\RxJavaCallAdapter\RxJava2CallAdapter。

抛开mock测试相关,CallAdapter.Factory的实现类分布在retrofit-adapters包中,有GuavaCallAdapterFactory\Java8CallAdapterFactory\RxJavaCallAdapterFactory\RxJava2CallAdapterFactory\ScalaCallAdapterFactory。


Converter主要有三个方法,对应三个作用。

  1. 当请求带有请求体时,将请求体转换成OkHttp对应的RequestBody
  2. 将响应解析成需要的实体对象T
  3. 将Field\FieldMap\Header\HeaderMap\Path\Query\QueryMap等的值转换成String类型

当需要自定义数据转换机制时,可以实现该接口,并注册到Retrofit中。目前默认的数据转换采用Gson,也可根据需要自定义成xml\protoBuf\fastJson等。


三、根据设计模式分析源码

首先放一张stay大神画的Retrofit请求的流程图


image

接下来我们将根据这张流程图的走势,结合遇到的设计模式,分析Retrofit的设计源码。对于一些常见的、简单的设计模式,本文不做分析。






至此,我们已经分析到了Retrofit.create在动态代理时解析注解封装进ServiceMethod的过程。相信大家也需要一点时间消化,我们先休息会,稍后回来~~~~

上一篇 下一篇

猜你喜欢

热点阅读