Retrofit2快速入門

Retrofit2快速入門

大家好,又是心情澎湃的一天,今天我將給大家介紹Retrofit2這個(gè)庫.

Retrofit2是什么?

Retrofit是由Square公司出品的針對(duì)于Android和Java的類型安全的Http客戶端勾哩,吸取了RESTful的風(fēng)格,實(shí)質(zhì)上就是對(duì)okhttp 進(jìn)行了封裝,利用動(dòng)態(tài)代理實(shí)現(xiàn)了網(wǎng)絡(luò)接口底層請求,然后將返回的數(shù)據(jù)就行轉(zhuǎn)換成我們指定的Bean對(duì)象,極大的提高了效率,和網(wǎng)絡(luò)體驗(yàn).

RESTful相關(guān)文檔

使用依賴

首先在build.gradle中添加如下代碼职员,添加Retrofit2庫

compile 'com.squareup.retrofit2:retrofit:2.3.0'

創(chuàng)建實(shí)列

    Retrofit retrofit = new Retrofit.Builder()
        .baseUrl("baseurl/") //這里填入端口的url   
        .build();

必須以 /(斜線) 結(jié)束,不然會(huì)拋出一個(gè)IllegalArgumentException,所以如果你看到別的教程沒有以 / 結(jié)束崔梗,那么可能是直接從Retrofit1 copy過來的。

定義接口

以獲取一本書的頁數(shù)為例子

public interface API {
    @GET("book/{page}")
    Call<ResponseBody> getPage(@Path("page") int id);
}

在通過上面構(gòu)建的實(shí)列對(duì)象retorfit 進(jìn)行下一步操作
API api = retrofit.create(API.class);

構(gòu)建出代理對(duì)象.

開始請求

上一部已經(jīng)拿到了代理對(duì)象,接下來我們就需要使用代理對(duì)象來進(jìn)行網(wǎng)絡(luò)請求獲取數(shù)據(jù),如下代碼:

    Call<ResponseBody> page = api.getPage(10);

        page.enqueue(new Callback<ResponseBody>() {
            @Override
            public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                //請求成功返回的數(shù)據(jù)                

            }

            @Override
            public void onFailure(Call<ResponseBody> call, Throwable t) {
                //請求失敗

            }
        });

當(dāng)然上面只是異步的請求,回調(diào)到這兩個(gè)方法如果使用同步請求:

    try {
            Response<ResponseBody> response = page.execute();
            //可以根據(jù)返回的response在做處理
        } catch (IOException e) {
            e.printStackTrace();
        }

注意同步請求不要在主線程去使用,一半是在子線程里面發(fā)起請求,后面的代碼需要同步返回的數(shù)據(jù)方才使用
當(dāng)你將一些異步請求壓入隊(duì)列后逻澳,甚至你在執(zhí)行同步請求的時(shí)候闸天,你可以隨時(shí)調(diào)用 cancel 方法來取消請求

Retrofit注解詳解

剛剛已經(jīng)完成了retrofit最基本的快速使用方法,那么接下來就詳細(xì)介紹一下retrofit的注解,retrofit里面有很多注解,是一個(gè)很輕量級(jí)的庫,
一共37個(gè)類就有22個(gè)是注解類,所以大家這一塊一定要仔細(xì)認(rèn)真的看一下.

  • 請求方法類

@PATCH、@OPTIONS斜做、@HTTP苞氮、@HEAD、@PUT瓤逼、@GET笼吟、@PUT、@DELETE
方法注解和RESTFUL API有關(guān)
@PUT霸旗,PUT方法用來創(chuàng)建一個(gè)URI已知的資源贷帮,或?qū)σ阎Y源進(jìn)行完全替換,比如users/1诱告,因此PUT方法一般會(huì)用來更新一個(gè)已知資源撵枢,
除非在創(chuàng)建前,你完全知道自己要?jiǎng)?chuàng)建的對(duì)象的URI精居。
@PATCH 锄禽,PATCH方法是新引入的,是對(duì)PUT方法的補(bǔ)充靴姿,用來對(duì)已知資源進(jìn)行局部更新
@HEAD 沃但,與參數(shù)注解@Header不同,只請求頁面的首部空猜。
@OPTIONS 允許客戶端查看服務(wù)器的性能
@HTTP ,使用用戶自定義的verb進(jìn)行網(wǎng)絡(luò)請求

  • 標(biāo)記類
    @FormUrlEncoded绽慈、@Multipart、@Streaming辈毯。

@FormUrlEncoded 請求體是 From 表單
@Multipart 請求體是支持文件上傳的 From 表單
@Streaming 響應(yīng)體的數(shù)據(jù)用流的形式返回

  • 參數(shù)類
    @Headers坝疼、@Header、@Body谆沃、@Field钝凶、@FieldMap、@Part唁影、@PartMap@耕陷、Path、@Query据沈、@QueryMap哟沫、@Url

@Headers:使用 @Headers 注解設(shè)置固定的請求頭,所有請求頭不會(huì)相互覆蓋锌介,即使名字相同嗜诀。

@Header: 使用 @Header 注解動(dòng)態(tài)更新請求頭猾警,匹配的參數(shù)必須提供給 @Header ,若參數(shù)值為 null 隆敢,這個(gè)頭會(huì)被省略发皿,否則,會(huì)使用參數(shù)值的 toString 方法的返回值拂蝎。

@Body: 使用 @Body 注解穴墅,指定一個(gè)對(duì)象作為 request body 。

@Field: 表單提交温自,如登錄

@FieldMap 玄货、@Part 、@PartMap 捣作、@Path: 請求 URL 可以替換模塊來動(dòng)態(tài)改變誉结,替換模塊是 {}包含的字母數(shù)字字符串,替換的參數(shù)必須使用 @Path 注解的相同字符串券躁。

@Query: 查詢參數(shù)

@QueryMap: 復(fù)雜的查詢參數(shù)

@Url: 作用于方法參數(shù),用于添加請求的接口地址

Bean對(duì)象轉(zhuǎn)換

要自定義Converter<F, T>,需要先看一下GsonConverterFactory的實(shí)現(xiàn)掉盅,
GsonConverterFactory實(shí)現(xiàn)了內(nèi)部類Converter.Factory也拜。

其中GsonConverterFactory中的主要兩個(gè)方法,主要用于解析request和response的趾痘,
在Factory中還有一個(gè)方法stringConverter慢哈,用于String的轉(zhuǎn)換。

引入Gson支持:

compile 'com.squareup.retrofit2:converter-gson:2.0.2'

通過GsonConverterFactory為Retrofit添加Gson支持:

Gson gson = new GsonBuilder()
      //配置你的Gson
      .setDateFormat("yyyy-MM-dd hh:mm:ss")
      .create();

Retrofit retrofit = new Retrofit.Builder()
      .baseUrl("http://localhost:4567/")
      //可以接收自定義的Gson永票,當(dāng)然也可以不傳
      .addConverterFactory(GsonConverterFactory.create(gson))
      .build();   

然后通過 Call<ResponseBody> 這里替換ResponseBody 為自己的Bean對(duì)象Call<JavaBean> 然后請求回來的數(shù)據(jù)就會(huì)自動(dòng)轉(zhuǎn)換.

結(jié)合okhttp,并使用Interceptor

對(duì)應(yīng)依賴:

    compile 'com.squareup.okhttp3:logging-interceptor:3.5.0'

    testImplementation 'com.squareup.okhttp3:mockwebserver:3.9.1'

Retrofit 2.0 底層依賴于okHttp卵贱,所以需要使用okHttp的Interceptors 來對(duì)所有請求進(jìn)行攔截。
我們可以通過自定義Interceptor來實(shí)現(xiàn)很多操作,打印日志,緩存,重試等等侣集。

要實(shí)現(xiàn)自己的攔截器需要有以下步驟

//創(chuàng)建OkHttpClient

OkHttpClient client = new OkHttpClient.Builder()
.addInterceptor(new HttpLoggingInterceptor())
.build();
retrofit = new Retrofit.Builder()
.baseUrl(Urls.baseUrl)
.client(client)//添加自定義OkHttpClient
.build();

如何結(jié)合RxJava

引入RxJava支持:

//這里支持的是RxJava2
compile 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
compile "io.reactivex.rxjava2:rxjava:2.1.7"

如何添加:

retrofit = new Retrofit.Builder()
        .baseUrl(Urls.baseUrl)
        // 針對(duì)rxjava2.x  
        .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
        .build();

在請求的接口中直接指定Observable 的Rxjava對(duì)象:

public interface Api{
  @POST("/page")
  Observable<Event1> getBook();
}

然后在通過以下代碼完成一套行云流水的結(jié)合操作:

 Retrofit retrofit= new Retrofit.Builder()
                .baseUrl(baseUrl)
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .build();

        API movieService = retrofit.create(API.class);

        movieService.getTest()
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Subscriber<Event1>() {
                    @Override
                    public void onCompleted() {
                    }

                    @Override
                    public void onError(Throwable e) {
                    }

                    @Override
                    public void onNext(MovieEntity movieEntity) {
                    }
                });

這樣完成了Retrofit和Rxjava的結(jié)合,這只是最基本的操作,更多操作還需要大家多多練習(xí),提升自己,方能想怎么玩就怎么玩!
這是官方文檔,想要深入研究的小伙伴可以好好學(xué)一波,加油!
Retrofit官方文檔

如有更好的建議提議,可以發(fā)到我的郵箱diosamolee2014@gmail.com

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末键俱,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子世分,更是在濱河造成了極大的恐慌编振,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件臭埋,死亡現(xiàn)場離奇詭異踪央,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)瓢阴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門畅蹂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人荣恐,你說我怎么就攤上這事液斜。” “怎么了?”我有些...
    開封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵旗唁,是天一觀的道長畦浓。 經(jīng)常有香客問我,道長检疫,這世上最難降的妖魔是什么讶请? 我笑而不...
    開封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮屎媳,結(jié)果婚禮上夺溢,老公的妹妹穿的比我還像新娘。我一直安慰自己烛谊,他們只是感情好风响,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著丹禀,像睡著了一般状勤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上双泪,一...
    開封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天持搜,我揣著相機(jī)與錄音,去河邊找鬼焙矛。 笑死葫盼,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的村斟。 我是一名探鬼主播贫导,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蟆盹!你這毒婦竟也來了孩灯?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤日缨,失蹤者是張志新(化名)和其女友劉穎钱反,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體匣距,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡面哥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了毅待。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片尚卫。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖尸红,靈堂內(nèi)的尸體忽然破棺而出吱涉,到底是詐尸還是另有隱情刹泄,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布怎爵,位于F島的核電站特石,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏鳖链。R本人自食惡果不足惜姆蘸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望芙委。 院中可真熱鬧逞敷,春花似錦、人聲如沸灌侣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽侧啼。三九已至牛柒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間慨菱,已是汗流浹背焰络。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留符喝,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓甜孤,卻偏偏與公主長得像协饲,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子缴川,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345