Retrofit2 源码解析

Retrofit是什么

  简单的说它是一个基于OkHttp的RESTFUL Api请求工具,从功能上来讲和Google的Volley功能上很类似,可是使用上很不类似。程序员

Retrofit怎么用

  好比你要请求这么一个api,查看知乎专栏的某个做者信息:api

https://zhuanlan.zhihu.com/api/columns/{user}网络

 

 首先,你须要建立一个Retrofit对象,而且指定api的域名:异步

public static final String API_URL = "https://zhuanlan.zhihu.com";

Create a very simple REST adapter which points the Zhuanlan API.
Retrofit retrofit = new Retrofit.Builder()
    .baseUrl(API_URL)
    .addConverterFactory(GsonConverterFactory.create())
    .build();

  其次,你要根据api新建一个Java接口,用Java注解来描述这个apiide

public interface ZhuanLanApi {
    @GET("/api/columns/{user} ")
    Call<ZhuanLanAuthor> getAuthor(@Path("user") String user)
}

  再用这个retrofit对象建立一个ZhuanLanApi对象:工具

ZhuanLanApi api = retrofit.create(ZhuanLanApi.class);

Call<ZhuanLanAuthor> call = api.getAuthor("qinchao");

这样就表示你要请求的api是https://zhuanlan.zhihu.com/api/columns/qinchao源码分析

  最后你就能够用这个call对象得到数据了,enqueue方法是异步发送http请求的,若是你想用同步的方式发送可使用execute()方法,call对象还提供cancel()isCancel()等方法获取这个Http请求的状态ui

// 请求数据,而且处理response
call.enqueue(new Callback<ZhuanLanAuthor>() {
    @Override
    public void onResponse(Response<ZhuanLanAuthor> author) {
        System.out.println("name: " + author.getName());
    }
    @Override
    public void onFailure(Throwable t) {
    }
});

Retrofit的原理

  Retrofit就是充当了一个适配器(Adapter)的角色:将一个Java接口翻译成一个Http请求,而后用OkHttp去发送这个请求spa

  核心思想就是:Java的动态代理插件

  Java动态代理就是给了程序员一种可能:当你要调用某个Class的方法前或后,插入你想要执行的代码

Retrofit关心的就是method和它的参数args,接下去Retrofit就会用Java反射获取到getAuthor方法的注解信息,配合args参数,建立一个ServiceMethod对象

ServiceMethod就像是一个中央处理器,传入Retrofit对象和Method对象,调用各个接口和解析器,最终生成一个Request,包含api 的域名、path、http请求方法、请求头、是否有body、是不是multipart等等。最后返回一个Call对象,Retrofit2中Call接口的默认实现是OkHttpCall,它默认使用OkHttp3做为底层http请求client

使用Java动态代理的目的就要拦截被调用的Java方法,而后解析这个Java方法的注解,最后生成Request由OkHttp发送

Retrofit的源码分析

组成:

  1. 一个retrofit2.http包,里面所有是定义HTTP请求的Java注解,好比GETPOSTPUTDELETEHeadersPathQuery等等
  2. 余下的retrofit2包中几个类和接口就是所有retrofit的代码了,代码真的不多,很简单,由于retrofit把网络请求这部分功能所有交给了OkHttp了

接口:

  一、Callback<T>:这个接口就是retrofit请求数据返回的接口,只有两个方法void onResponse(Response<T> response);和void onFailure(Throwable t);

  二、Converter<F, T>:这个接口主要的做用就是将HTTP返回的数据解析成Java对象,主要有Xml、Gson、protobuf等等,你能够在建立Retrofit对象时添加你须要使用的Converter实现

  三、Call<T>:这个接口主要的做用就是发送一个HTTP请求,Retrofit默认的实现是OkHttpCall<T>,你能够根据实际状况实现你本身的Call类,这个设计和Volley的HttpStack接口设计的思想很是类似,子类能够实现基于HttpClientHttpUrlConnetction的HTTP请求工具,这种设计很是的插件化,并且灵活

四、CallAdapter<T>:上面说到过,CallAdapter中属性只有responseType一个,还有一个<R> T adapt(Call<R> call)方法,这个接口的实现类也只有一个,DefaultCallAdapter。这个方法的主要做用就是将Call对象转换成另外一个对象,多是为了支持RxJava才设计这个类的吧

 

参考文献:http://www.jianshu.com/p/c1a3a881a144

相关文章
相关标签/搜索