簡單的說它是一個基於OkHttp的RESTFUL Api請求工具,從功能上來講和Google的Volley功能上很類似,可是使用上很不類似。程序員
好比你要請求這麼一個api,查看知乎專欄的某個做者信息:api
首先,你須要建立一個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就是充當了一個適配器(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發送
組成:
retrofit2.http
包,裏面所有是定義HTTP請求的Java註解,好比GET
、POST
、PUT
、DELETE
、Headers
、Path
、Query
等等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
接口設計的思想很是類似,子類能夠實現基於HttpClient
或HttpUrlConnetction
的HTTP請求工具,這種設計很是的插件化,並且靈活
四、CallAdapter<T>:上面說到過,
CallAdapter
中屬性只有responseType
一個,還有一個<R> T adapt(Call<R> call)
方法,這個接口的實現類也只有一個,DefaultCallAdapter
。這個方法的主要做用就是將Call
對象轉換成另外一個對象,多是爲了支持RxJava才設計這個類的吧
參考文獻:http://www.jianshu.com/p/c1a3a881a144