Android Retrofit 初體驗

RetrofitSquare旗下的一款為Android和Java打造的類型安全開源HTTP請求構(gòu)造工具针贬。Retrofit的請求構(gòu)造,響應以及數(shù)據(jù)的序列化等都相當?shù)暮啙嵣胶ΑT谶M行了簡單的嘗試之后言疗,將自己的使用心得做一個記錄。

環(huán)境

平臺:Android Studio2.2.3
Retrofit版本:2.1
測試接口:http://ip.taobao.com/

使用前配置

在 Android Studio 平臺下柬甥,可以通過構(gòu)建工具 Gradle 很簡單的將 Retrofit引入到工程中來饮六,在 app:build.gradle 中引入以下依賴

compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.google.code.gson:gson:2.4'
compile 'com.squareup.retrofit2:converter-gson:2.1.0'

在工程中,我引入 Google 的Gson 作為整個工程的序列化工具苛蒲,Retrofit 本身只能反序列化 OkHttpResponseBody,或者使用注解@Body接受它的 RequestBody 請求構(gòu)造體卤橄。如果想要引入Gson進行序列化和反序列化的操作,則需要在工程中引入converter-gson工具臂外。同時窟扑,官網(wǎng)還提供了其他幾種轉(zhuǎn)化工具:

  • Gson: com.squareup.retrofit2:converter-gson
  • Jackson: com.squareup.retrofit2:converter-jackson
  • Moshi: com.squareup.retrofit2:converter-moshi
  • Protobuf: com.squareup.retrofit2:converter-protobuf
  • Wire: com.squareup.retrofit2:converter-wire
  • Simple XML: com.squareup.retrofit2:converter-simplexml
  • Scalars (primitives, boxed, and String): com.squareup.retrofit2:converter-scalars

同步完成之后就能夠進行開發(fā)了

Retrofit的使用

想要完成一次網(wǎng)絡請求,構(gòu)造請求漏健,發(fā)起請求嚎货,接受回調(diào)是最基本的三個步驟。我們接下來就從這三個方面切入Retrofit的世界

構(gòu)造請求

Retrofit是基于注解構(gòu)造的漾肮。我想要發(fā)起對一個ip地址的查詢請求厂抖,首先要構(gòu)造這個請求茎毁,通過對接口文檔的查詢克懊,請求是以Get的方式傳入一個ip地址就夠了。整個請求的構(gòu)造非常簡單

public interface ApiService {
    @GET("service/getIpInfo.php")
    Call<ResponseBody<IpInfo>> getIpInfo(@Query("ip") String ip);
}

在接口上注解上請求的方式(GET)和路徑(service/getIpInfo.php),要查詢(@Query)的參數(shù)key(ip)和值(ip).

序列化

可以看出七蜘,請求的響應數(shù)據(jù)結(jié)構(gòu)是ResponseBody<IpInfo>谭溉,響應的數(shù)據(jù)可以直接被反序列化成一個pojo供我們直接調(diào)用。
ResponseBody

public class ResponseBody<T> {
    private int code;
    private T data;

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }

    @Override
    public String toString() {
        return new Gson().toJson(this);
    }
}

IpInfo

public class IpInfo {

    /**
     * country : 中國
     * country_id : CN
     * area : 西南
     * area_id : 500000
     * region : 四川省
     * region_id : 510000
     * city : 成都市
     * city_id : 510100
     * county :
     * county_id : -1
     * isp : 電信
     * isp_id : 100017
     * ip : 171.221.144.107
     */

    private String country;
    private String country_id;
    private String area;
    private String area_id;
    private String region;
    private String region_id;
    private String city;
    private String city_id;
    private String county;
    private String county_id;
    private String isp;
    private String isp_id;
    private String ip;

    public String getCountry() {
        return country;
    }

    public void setCountry(String country) {
        this.country = country;
    }

    public String getCountry_id() {
        return country_id;
    }

    public void setCountry_id(String country_id) {
        this.country_id = country_id;
    }

    public String getArea() {
        return area;
    }

    public void setArea(String area) {
        this.area = area;
    }

    public String getArea_id() {
        return area_id;
    }

    public void setArea_id(String area_id) {
        this.area_id = area_id;
    }

    public String getRegion() {
        return region;
    }

    public void setRegion(String region) {
        this.region = region;
    }

    public String getRegion_id() {
        return region_id;
    }

    public void setRegion_id(String region_id) {
        this.region_id = region_id;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getCity_id() {
        return city_id;
    }

    public void setCity_id(String city_id) {
        this.city_id = city_id;
    }

    public String getCounty() {
        return county;
    }

    public void setCounty(String county) {
        this.county = county;
    }

    public String getCounty_id() {
        return county_id;
    }

    public void setCounty_id(String county_id) {
        this.county_id = county_id;
    }

    public String getIsp() {
        return isp;
    }

    public void setIsp(String isp) {
        this.isp = isp;
    }

    public String getIsp_id() {
        return isp_id;
    }

    public void setIsp_id(String isp_id) {
        this.isp_id = isp_id;
    }

    public String getIp() {
        return ip;
    }

    public void setIp(String ip) {
        this.ip = ip;
    }

    @Override
    public String toString() {
        return new Gson().toJson(this);
    }
}

發(fā)起請求并獲取回調(diào)

發(fā)起請求需要先構(gòu)造Retrofit對象橡卤,并在該對象保存一些基本的信息扮念,比如BaseUrlConvertFactory等信息。然后通過Retrofit對象實例化我們的接口對象ApiService.

Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("http://ip.taobao.com/")
                .addConverterFactory(GsonConverterFactory.create())
                .build();
ApiService apiService = retrofit.create(ApiService.class);

Call<ResponseBody<IpInfo>> call = apiService.getIpInfo("171.221.144.107");
call.enqueue(new Callback<ResponseBody<IpInfo>>() {
    @Override
    public void onResponse(Call<ResponseBody<IpInfo>> call, Response<ResponseBody<IpInfo>> response) {
    ResponseBody<IpInfo> ipInfoResponseBody = response.body();
    }

    @Override
    public void onFailure(Call<ResponseBody<IpInfo>> call, Throwable t) {
    progressBar.setVisibility(View.GONE);
    }
});

總結(jié)

整個流程如上面所示碧库,很簡單的發(fā)起一次網(wǎng)絡請求柜与,并成功接受到響應數(shù)據(jù)。整個網(wǎng)絡執(zhí)行層的代碼僅僅十多行嵌灰。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末弄匕,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子沽瞭,更是在濱河造成了極大的恐慌迁匠,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件驹溃,死亡現(xiàn)場離奇詭異城丧,居然都是意外死亡,警方通過查閱死者的電腦和手機豌鹤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進店門亡哄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人布疙,你說我怎么就攤上這事磺平』耆裕” “怎么了?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵拣挪,是天一觀的道長擦酌。 經(jīng)常有香客問我,道長菠劝,這世上最難降的妖魔是什么赊舶? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮赶诊,結(jié)果婚禮上笼平,老公的妹妹穿的比我還像新娘。我一直安慰自己舔痪,他們只是感情好寓调,可當我...
    茶點故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著锄码,像睡著了一般夺英。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上滋捶,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天痛悯,我揣著相機與錄音,去河邊找鬼重窟。 笑死载萌,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的巡扇。 我是一名探鬼主播扭仁,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼厅翔!你這毒婦竟也來了乖坠?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤知给,失蹤者是張志新(化名)和其女友劉穎瓤帚,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體涩赢,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡戈次,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了筒扒。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片怯邪。...
    茶點故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖花墩,靈堂內(nèi)的尸體忽然破棺而出悬秉,到底是詐尸還是另有隱情澄步,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布和泌,位于F島的核電站村缸,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏武氓。R本人自食惡果不足惜梯皿,卻給世界環(huán)境...
    茶點故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望县恕。 院中可真熱鬧东羹,春花似錦、人聲如沸忠烛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽美尸。三九已至冤议,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間火惊,已是汗流浹背求类。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工奔垦, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留屹耐,地道東北人。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓椿猎,卻偏偏與公主長得像惶岭,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子犯眠,可洞房花燭夜當晚...
    茶點故事閱讀 45,512評論 2 359

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

  • 整體Retrofit內(nèi)容如下: 1按灶、Retrofit解析1之前哨站——理解RESTful 2、Retrofit解析...
    隔壁老李頭閱讀 3,970評論 1 3
  • Retrofit是squareup公司的開源力作,和同屬squareup公司開源的OkHttp量蕊,一個負責網(wǎng)絡調(diào)度铺罢,...
    藍灰_q閱讀 41,609評論 23 281
  • 什么是Retrofit2 Retrofit是一個給Android和Java用的類型安全的HTTP客戶端,它將網(wǎng)絡請...
    不羈的木木閱讀 1,173評論 0 49
  • 親愛的爸爸: 您好嗎残炮?分別整整過去了四年韭赘,我想您了!不知您和媽媽在那邊過得好不好势就?如有什么需要泉瞻,請一定托夢告訴我脉漏,...
    靜的花田閱讀 284評論 2 8
  • 鋪一紙流年,打開歲月的經(jīng)卷袖牙,抒一箋素語侧巨,筆墨間落下風花雪月;歲月沉淀鞭达,煙火流年刃泡,如夢蹁躚,那時碉怔,歲月信箋上烘贴,一...
    鳳棲梧桐閱讀 544評論 0 4