Retrofit使用

Retrofit與okhttp都是Square公司出品浸颓,retrofit就是在okhttp的基礎(chǔ)上做了一層封裝耕赘。網(wǎng)絡(luò)請求相關(guān)操作交給Okhttp處理搪哪,我們只需要通過簡單的配置就能使用retrofit來進行網(wǎng)絡(luò)請求了巡扇。

Retrofit和OkHttp關(guān)系.png

Retrofit使用入門

首先創(chuàng)建一個接口:

    public interface UserService {
          @GET("users/{user}/lessons")
          Call<List<Lesson>> listLessons(@Path("user") String user);
    } 

這個接口是為了通過一個url獲取用戶課程列表的接口,當然看著這個url地址好像也不是一個完整的能夠使用的url地址炊琉,確實是這樣的展蒂,Retrofit請求的地址是由兩部分組成的,一部分是后面要介紹的Retrofit對象中的baseUrl和類似上面接口中的path地址共同構(gòu)成的苔咪。
接下來我們是不是要定義一個實現(xiàn)該接口的類呢 ? 當然不是的啦锰悼。我們接下來要做的是只需構(gòu)造一個Retrofit對象即可,至于原理团赏,后面會說到箕般。

Retrofit retrofit = new Retrofit.Builder()
    .baseUrl("https://api.test.com/")
    .build();

UserService service = retrofit.create(UserService.class);
Call<List<Lesson>> lessonCall = service.listLessons("test");
Response<List<Lesson>> result = null;
//同步調(diào)用
result = lessonCall.execute();
//異步調(diào)用
lessonCall.enqueue(new Callback<List<Lesson>>() {
            @Override
            public void onResponse(Call<List<Lesson>> call, Response<List<Lesson>> response) {
                result  = response.body();
            }

            @Override
            public void onFailure(Call<List<Lesson>> call, Throwable t) {
                t.printStackTrace();
            }
        });

這樣就能輕易的調(diào)用http請求了,當然了舔清,這只是一個小小的簡單的demo丝里,Retrofit的功能不止這些。

Retrofit使用更上一層樓

前面我們弄了一個很基本的一個例子体谒,下面我們將更進一步使用Retrofit更多的功能杯聚。

請求類型: 我們都知道http的請求類型有GET,POST,DELETE,PUT,HEAD,PATCH 這些類型,而與之相對應(yīng)的抒痒,Retrofit也包含了相對應(yīng)的注解給予支持幌绍,@GET,@POST,@DELETE,@PUT,@HEAD,@PATCH 使用對應(yīng)的注解即可。

請求參數(shù):

  • @Query && @QueryMap : @Query用于http請求的單個query參數(shù)傳遞;@QueryMap用于多個參數(shù)傳遞评汰,鍵值對纷捞。
  • @Field && @FieldMap : @Field 用于post請求的單個參數(shù)傳遞;@FieldMap用于post請求多個參數(shù)傳遞痢虹。
  • @Header && @HeaderMap: @Header 用于單個請求頭參數(shù);@HeaderMap用于多個請求頭參數(shù)傳遞被去。
  • @Part && @PartMap:@Part用于單個文件的上傳;@PartMap用于多個文件上傳。
  • @Path:用于path路徑變量的傳遞接收奖唯。
    上述示例代碼:
    @GET("users/{user}/lessons")
    Call<List<Lesson>> listLessons(@Path("user") String user);

    @GET("users/getuser")
    Call<User> getUser(@Query("userId")String userId);

    @GET("users/getUserByCondition")
    Call<List<User>> getUserByCondition(@QueryMap Map<String,String> conditionMap);

    @POST("users/authorization")
    Call<User> authorization(@HeaderMap Map headerMap);
    
    @Multipart//當有文件需要上傳時加入
    @POST("users/add")
    Call<User> addUser(@FieldMap Map userInfo, @Part("photo")MultipartBody.Part file);

上面這些示例都是可以直接返回對應(yīng)的結(jié)果類型惨缆,但如果我們想做一個通用的Retrofit封裝的http請求工具類,那就只好返回最原始的string類型丰捷,畢竟不同請求返回結(jié)果類型不同坯墨,像這樣:

public interface CommonHttpService{

    @GET
    Call<String> getHttpRequest(@Url String url, @HeaderMap Map<String,String> headerMap, @QueryMap Map<String,String> queryMap);

    @FormUrlEncoded
    @POST
    Call<String> postHttpRequest(@Url String url, @HeaderMap Map<String,String> headerMap, @QueryMap Map<String,String> queryMap, @FieldMap Map<String,String> formMap);

    @POST
    Call<String> postHttpRequest(@Url String url, @HeaderMap Map<String,String> headerMap, @QueryMap Map<String,String> queryMap, @Body String body);

}

你會發(fā)現(xiàn)與前面的有些許不同,首先呢病往,@POST@GET后面沒有跟上一部分path路徑了捣染,而是改由參數(shù)中的@Url String url在調(diào)用方法時傳入,增加了靈活性停巷。

Converter
如果僅僅是這樣是返回不了對應(yīng)的結(jié)果類型的耍攘,需要用到converter榕栏,converter的作用就是將RequestBody或ResponseBody轉(zhuǎn)換為我們需要的類型,例如前面的我們想要使請求返回String類型還需要加上依賴:

        <dependency>
            <groupId>com.squareup.retrofit2</groupId>
            <artifactId>converter-scalars</artifactId>
            <version>LATEST</version>
        </dependency>

然后在構(gòu)造Retrofit對象時蕾各,加上ScalarsConverterFactory的配置:

        Retrofit retrofit = new Retrofit.Builder().baseUrl("http://api.test.com")
                .addConverterFactory(ScalarsConverterFactory.create())
                .build();

ScalarsConverterFactory里面包含了對ResponseBody進行String扒磁,原始數(shù)據(jù)類型及其包裝類的轉(zhuǎn)換。
目前式曲,Retrofit已經(jīng)有了幾個官方的converter:

//uses Gson for serialization to and from JSON
Gson: com.squareup.retrofit2:converter-gson

//uses Jackson for serialization to and from JSON
Jackson: com.squareup.retrofit2:converter-jackson

//uses Moshi for serialization to and from JSON
Moshi: com.squareup.retrofit2:converter-moshi

//A Converter which uses Protocol Buffer binary serialization
Protobuf: com.squareup.retrofit2:converter-protobuf

//A Converter which uses Wire for protocol buffer-compatible serialization.
Wire: com.squareup.retrofit2:converter-wire

//A Converter which uses Simple for XML serialization.
Simple XML: com.squareup.retrofit2:converter-simplexml

//A Converter which supports converting strings and both primitives and their boxed types to text/plain bodies.
Scalars : com.squareup.retrofit2:converter-scalars

這些converter已經(jīng)能基本滿足我們?nèi)粘5男枰朔镣校彩掠欣猓热缥覀円用芙饷芰咝撸膶懡Y(jié)果等兰伤,所以這時候就需要我們自己來寫converter.我們以自定義一個 String Converter作為一個例子:

  • 自定義converter:
    先定義一個converter factory:
public class CustomStringConverterFactory extends Converter.Factory {

    public static CustomStringConverterFactory create() {
        return new CustomStringConverterFactory();
    }

    @Override
    public  Converter<ResponseBody, ?> responseBodyConverter(Type type,
     Annotation[] annotations, Retrofit retrofit) {
        if (type == String.class) {
            return new CustomStringConverter();
        }
        return null;
    }
}

這里我們只是將ResponseBody進行轉(zhuǎn)換,如果你同時要將RequestBody進行轉(zhuǎn)換脆贵,那就同時要覆寫public Converter<?, RequestBody> requestBodyConverter(Type type,Annotation[] parameterAnnotations, Annotation[] methodAnnotations, Retrofit retrofit)方法.

定義Converter,轉(zhuǎn)換的邏輯在這里面進行:

public class CustomStringConverter implements Converter<ResponseBody, String> {

    @Override
    public String convert(ResponseBody value) throws IOException {
        return value.string();
    }
}

最后一步就是將converterfactory加入到Retrofit對象構(gòu)造中使用:

Retrofit retrofit = new Retrofit.Builder().baseUrl("http://api.test.com")                .addConverterFactory(CustomStringConverterFactory.create())
.build();

好了医清,這樣就能愉快的使用你自己定義的converter了,這里需要注意的是你如果添加的converter有多個的話小心順序。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末卖氨,一起剝皮案震驚了整個濱河市会烙,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌筒捺,老刑警劉巖柏腻,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異系吭,居然都是意外死亡五嫂,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進店門肯尺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來沃缘,“玉大人,你說我怎么就攤上這事则吟』蓖危” “怎么了?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵氓仲,是天一觀的道長水慨。 經(jīng)常有香客問我,道長敬扛,這世上最難降的妖魔是什么晰洒? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮啥箭,結(jié)果婚禮上垦搬,老公的妹妹穿的比我還像新娘斤讥。我一直安慰自己丹擎,他們只是感情好,可當我...
    茶點故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布炼七。 她就那樣靜靜地躺著,像睡著了一般布持。 火紅的嫁衣襯著肌膚如雪豌拙。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天题暖,我揣著相機與錄音按傅,去河邊找鬼。 笑死胧卤,一個胖子當著我的面吹牛唯绍,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播枝誊,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼况芒,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了叶撒?” 一聲冷哼從身側(cè)響起绝骚,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎祠够,沒想到半個月后压汪,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡古瓤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年止剖,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片落君。...
    茶點故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡穿香,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出绎速,到底是詐尸還是另有隱情皮获,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布朝氓,位于F島的核電站魔市,受9級特大地震影響主届,放射性物質(zhì)發(fā)生泄漏赵哲。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一君丁、第九天 我趴在偏房一處隱蔽的房頂上張望枫夺。 院中可真熱鬧,春花似錦绘闷、人聲如沸橡庞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽扒最。三九已至丑勤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間吧趣,已是汗流浹背法竞。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留强挫,地道東北人岔霸。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像俯渤,于是被迫代替她去往敵國和親呆细。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,543評論 2 349

推薦閱讀更多精彩內(nèi)容

  • Retrofit is a type-safe HTTP client for Android and Java....
    一只小雞仔閱讀 3,277評論 3 25
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理八匠,服務(wù)發(fā)現(xiàn)絮爷,斷路器,智...
    卡卡羅2017閱讀 134,633評論 18 139
  • 本文翻譯自https://futurestud.io/tutorials/retrofit-getting-sta...
    sakasa閱讀 18,450評論 3 54
  • Retrofit簡介 Retrofit是大名鼎鼎的 Square 公司開源的適用于Android與Java的網(wǎng)絡(luò)請...
    winter1991閱讀 19,669評論 18 71
  • OKHttp(一)之Calls OKHttp(二)之Connections OkHttp(三)之使用方法 OkHt...
    sakasa閱讀 2,808評論 0 15