Retrofit源碼探討
前面一篇介紹了Retrofit的基本用法,再結(jié)合前面的Okhttp的研究,那么Retrofit框架,其實主要就是以接口的形式封裝了Okhttp的請求,這包括它的請求參數(shù)和接口的封裝。
String baseUrl ="http://ip.taobao.com";
Retrofit retrofit =new Retrofit.Builder()
.baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create())
.build();
APIService apiService = retrofit.create(APIService.class);
Call call = apiService.getIpInfo(ip);
同樣,Retrofit也是采用了建造者模式,通過Retrofit.Builder()添加各種需要的配置信息,最后.build()方法構(gòu)建了Retrofit對象,Retrofit對象里面包含了一下內(nèi)容:

最主要的就是okhttp3對象本身和處理返回信息的Converter。
接下來是拿到retrofit對象調(diào)用create(APIService.class)創(chuàng)建請求接口文件,

這個方法里面用Platform生成返回對象,它里面用試錯的方式生成實際的Platform對象,然后在這個平臺下去實例化APIService.class,最后返回loadMethodHandler(method).invoke(args)對象,這個OkHttpCall對象實際上是實現(xiàn)了OkHttp的Call接口的對象,也就是說apiService是個OkHttpCall類型的。

然后,apiService.getIpInfo(ip)拿到了具體的OkHttp的Call對象,接下來就可以進行網(wǎng)絡(luò)請求了。
這是Retrofit接口請求的部分,接下來看看參數(shù)的部分。請求方式和參數(shù)的部分都是在APIService中,也就是在實例化的時候使用的,我們就追蹤這個Service參數(shù)。
一個是Platform的invokeDefaultMethod方法,一個是loadMethodHandler(method).invoke(args)方法中的args。前面的方法返回的是一個Object(APIService)對象,后面一個是將args傳入OkHttpCall對象中也是作為Object對象。我們就看看在OkHttpCall中Object是怎么使用的。

就是在enqueue方法中調(diào)用createRawCall的方法是用了object.

這個方法是生成了OKHttp的call對象,跟著進入requestFactory.create(args)方法看一看。

這個方法里面的RequestAction使用了傳遞過來的Object參數(shù),RequestAction里面有幾個關(guān)于請求體的類,如Field,F(xiàn)ieldMap,Query,QueryMap,StringUrl,Header,Path等,各個里面有都繼承RequestAction實現(xiàn)抽象的perform方法,那就舉例看一下Query的perform方法吧。


這里面又有個HttpUrl.BuilderurlBuilder,再進去看它的addEncodedQueryParameter方法:

encodedQueryNamesAndValues就是個List集合,順著看下去最終目的就是把參數(shù)變成String類型添加到這個集合里去,然后這個集合作為參數(shù)復(fù)制到okhttp3的HttpUrl中使用:

到此,Retorfit就捋完了。
總結(jié):Retorfit就是按照okhttp3的思想進行的封裝,充分體現(xiàn)了restfull思想,用起來挺方便的。不過,還是先掌握okhttp3再使用Retorfit會更好些。