Retrofit源碼探討
前面一篇介紹了Retrofit的基本用法仔蝌,再結(jié)合前面的Okhttp的研究,那么Retrofit框架绷柒,其實(shí)主要就是以接口的形式封裝了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生成返回對象患雇,它里面用試錯的方式生成實(shí)際的Platform對象,然后在這個平臺下去實(shí)例化APIService.class宇挫,最后返回loadMethodHandler(method).invoke(args)對象苛吱,這個OkHttpCall對象實(shí)際上是實(shí)現(xiàn)了OkHttp的Call接口的對象,也就是說apiService是個OkHttpCall類型的器瘪。
然后翠储,apiService.getIpInfo(ip)拿到了具體的OkHttp的Call對象,接下來就可以進(jìn)行網(wǎng)絡(luò)請求了橡疼。
這是Retrofit接口請求的部分援所,接下來看看參數(shù)的部分。請求方式和參數(shù)的部分都是在APIService中欣除,也就是在實(shí)例化的時候使用的住拭,我們就追蹤這個Service參數(shù)。
一個是Platform的invokeDefaultMethod方法历帚,一個是loadMethodHandler(method).invoke(args)方法中的args滔岳。前面的方法返回的是一個Object(APIService)對象,后面一個是將args傳入OkHttpCall對象中也是作為Object對象挽牢。我們就看看在OkHttpCall中Object是怎么使用的谱煤。
就是在enqueue方法中調(diào)用createRawCall的方法是用了object.
這個方法是生成了OKHttp的call對象,跟著進(jìn)入requestFactory.create(args)方法看一看卓研。
這個方法里面的RequestAction使用了傳遞過來的Object參數(shù)趴俘,RequestAction里面有幾個關(guān)于請求體的類,如Field奏赘,F(xiàn)ieldMap寥闪,Query,QueryMap磨淌,StringUrl疲憋,Header,Path等梁只,各個里面有都繼承RequestAction實(shí)現(xiàn)抽象的perform方法缚柳,那就舉例看一下Query的perform方法吧埃脏。
這里面又有個HttpUrl.BuilderurlBuilder,再進(jìn)去看它的addEncodedQueryParameter方法:
encodedQueryNamesAndValues就是個List集合秋忙,順著看下去最終目的就是把參數(shù)變成String類型添加到這個集合里去彩掐,然后這個集合作為參數(shù)復(fù)制到okhttp3的HttpUrl中使用:
到此,Retorfit就捋完了灰追。
總結(jié):Retorfit就是按照okhttp3的思想進(jìn)行的封裝堵幽,充分體現(xiàn)了restfull思想,用起來挺方便的弹澎。不過朴下,還是先掌握okhttp3再使用Retorfit會更好些。