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

相關文章
相關標籤/搜索