網(wǎng)絡(luò)請求(六)

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)容:

Retrofit

最主要的就是okhttp3對象本身和處理返回信息的Converter。

接下來是拿到retrofit對象調(diào)用create(APIService.class)創(chuàng)建請求接口文件,

create方法

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

loadMethodHandler(method).invoke(args)

然后,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是怎么使用的。


createRawCall

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

createRawCall

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

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方法吧。


Query的perform方法


RequestBuilder的addQueryParam方法

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

HttpUrl.BuilderurlBuilder的addEncodedQueryParameter

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

HttpUrl構(gòu)造方法

到此,Retorfit就捋完了。

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 適配器模式上一篇文章我們已經(jīng)分析了Retrofit解析注解封裝進ServiceMethod的流程,讀者在這里要記住...
    andcoder閱讀 780評論 0 2
  • 整體Retrofit內(nèi)容如下: 1、Retrofit解析1之前哨站——理解RESTful2、Retrofit解析2...
    隔壁老李頭閱讀 4,109評論 8 19
  • 前言 使用Retrofit已經(jīng)一段時間了,這貨挺好用的,還很特別,特別是使用接口來定義請求方式,這用法讓我對它的源...
    帶心情去旅行閱讀 3,472評論 3 21
  • Retrofit這個開源庫出來也有一定年頭了,記得之前還是在V1.0的版本的時候,之前在三月份也寫過一個Retro...
    lovejjfg閱讀 1,512評論 0 5
  • 黎明的曙光, 穿透虛偽的心臟。 那滴血, 吞噬了朝霞, 那張青面獠牙的面孔, 隨風(fēng)施虐著那片云彩; 晨露在光影中,...
    王寧子閱讀 443評論 4 5

友情鏈接更多精彩內(nèi)容