Retrofit2簡(jiǎn)單使用

1. Gradle配置

implementation 'com.squareup.retrofit2:retrofit:2.4.0'
implementation 'com.squareup.retrofit2:converter-gson:2.4.0'

2. 基本的get請(qǐng)求

我們使用GankApi 來(lái)進(jìn)行測(cè)試。
如: 獲取閑讀的主分類 https://gank.io/api/xiandu/categories
獲取結(jié)果如下:

{
    "error":false,
    "results":[
        {
            "_id":"57c83777421aa97cbd81c74d",
            "en_name":"wow",
            "name":"科技資訊",
            "rank":1
        },
        {
            "_id":"57c83577421aa97cb162d8b1",
            "en_name":"apps",
            "name":"趣味軟件/游戲",
            "rank":5
        },
       .....
    ]
}

a. 編寫實(shí)體類 Categorise.java

這個(gè)可以用一些工具自動(dòng)生成實(shí)體類。不需要get、set

/**
 * Auto-generated: 2018-09-19 22:43:15
 *
 * @author bejson.com (i@bejson.com)
 * @website http://www.bejson.com/java2pojo/
 */
public class Categories {

    private boolean error;
    private List<Results> results;

    public class Results {
        private String _id;
        private String en_name;
        private String name;
        private int rank;

        @Override
        public String toString() {
            return "Results{" +
                    "_id='" + _id + '\'' +
                    ", en_name='" + en_name + '\'' +
                    ", name='" + name + '\'' +
                    ", rank=" + rank +
                    '}';
        }
    }
    @Override
    public String toString() {
        return "Categories{" +
                "error=" + error +
                ", results=" + results +
                '}';
    }
}

b. 定義一個(gè)接口對(duì)象GankApi.java

public interface GankApi {
     //完整url: https://gank.io/api/xiandu/categories 姥宝,https://gank.io/api/作為baseUrl
    @Get("xiandu/categories")
    Call<Categories> getCategories();
}

c. 創(chuàng)建retrofit并進(jìn)行數(shù)據(jù)請(qǐng)求

NetWork.java

public class NetWork{
    private static GankApi sGankApi;

    public static final String BASE_URL = "https://gank.io/api/";

    private static GankApi getGankApi() {
        if (sGankApi == null) {
            sGankApi = new Retrofit.Builder()
                    .baseUrl(BASE_URL)
                    .addConverterFactory(GsonConverterFactory.create())
                    .build().create(GankApi.class);
        }
        return sGankApi;
    }
    
    //異步操作方式
    public static void getGankCategories(ResultCallback<Categories> resultCallback){
        Call<Categories> gankCategories = getGankApi().getGankCategories();
        gankCategories.enqueue(new Callback<Categories>() {
            @Override
            public void onResponse(Call<Categories> call, Response<Categories> response) {
                Categories body = response.body();
                if (body == null) {
                    resultCallback.onError("body is null!");
                    return;
                }
                resultCallback.onSuccess(body);
            }

            @Override
            public void onFailure(Call<Categories> call, Throwable t) {
                resultCallback.onError(t.getMessage());
            }
        });
    }
    //同步操作方式
    public static Categories getGankCategoriesSync() throws IOException {
        Call<Categories> gankCategories = getGankApi().getGankCategories();
        return gankCategories.execute().body();
    }
  public interface ResultCallback<T> {
      void onSuccess(T result);
      void onError(String message);
  }
}

d. 簡(jiǎn)單測(cè)試一下

textView = findViewById(R.id.textView);
//異步測(cè)試
NetworkUtil.getGankCategories(new ResultCallback<Categories>() {
    @Override
    public void onSuccess(Categories results) {
         textView.setText(results.toString());
    }
   @Override
   public void onError(String message) {
        textView.setText(message);
   }
});

//同步測(cè)試
//同步方式,比較麻煩,下面測(cè)試都是異步方法測(cè)試
Callable<Categories> categoriesCallable = new Callable<Categories>() {
    @Override
    public Categories call() throws Exception {
        return NetworkUtil.getGankCategoriesSync();
    }
};
try {
     Categories categories = getThreadPool().submit(categoriesCallable).get();
     textView.setText(categories.toString());
} catch (ExecutionException e) {
    e.printStackTrace();
     textView.setText(e.getMessage());
} catch (InterruptedException e) {
    e.printStackTrace();
    textView.setText(e.getMessage());
}
image.png

3. 動(dòng)態(tài)的url訪問(wèn)@PATH

https://gank.io/api/data/Android/10/1

分類數(shù)據(jù): http://gank.io/api/data/數(shù)據(jù)類型/請(qǐng)求個(gè)數(shù)/第幾頁(yè)

  • 數(shù)據(jù)類型: 福利 | Android | iOS | 休息視頻 | 拓展資源 | 前端 | all
  • 請(qǐng)求個(gè)數(shù): 數(shù)字驶俊,大于0
  • 第幾頁(yè):數(shù)字剥汤,大于0

實(shí)體類:Stories.java

package com.dxl.retrofittest.Model;

/**
 * Copyright 2018 bejson.com
 */

import java.util.Date;
import java.util.List;

/**
 * Auto-generated: 2018-09-23 8:7:44
 *
 * @author bejson.com (i@bejson.com)
 * @website http://www.bejson.com/java2pojo/
 */
public class Stories {
    private boolean error;
    private List<Results> results;
    @Override
    public String toString() {
        return "Stories{" +
                "error=" + error +
                ", results=" + results +
                '}';
    }
    public class Results {
        private String _id;
        private Date createdAt;
        private String desc;
        private Date publishedAt;
        private String source;
        private String type;
        private String url;
        private boolean used;
        private String who;

        @Override
        public String toString() {
            return "Results{" +
                    "_id='" + _id + '\'' +
                    ", createdAt=" + createdAt +
                    ", desc='" + desc + '\'' +
                    ", publishedAt=" + publishedAt +
                    ", source='" + source + '\'' +
                    ", type='" + type + '\'' +
                    ", url='" + url + '\'' +
                    ", used=" + used +
                    ", who='" + who + '\'' +
                    '}';
        }
    }

}

接口 GankApi.java

public interface GankApi {
   ...
    //http://gank.io/api/data/Android/10/1
    @GET("data/{type}/{count}/{page}")
    Call<Stories> getGankStories(@Path("type") String type, @Path("count") int count, @Path("page") int page);
}

請(qǐng)求方法:

public static void getGankStories(String type, int page, int count, ResultCallback<Stories> resultCallback){
        Call<Stories> gankStories = getGankApi().getGankStories(type, count, page);
        gankStories.enqueue(new Callback<Stories>() {
            @Override
            public void onResponse(Call<Stories> call, Response<Stories> response) {
                Stories body = response.body();
                if (body == null) {
                    resultCallback.onError("body is null");
                    return;
                }
                resultCallback.onSuccess(body);
            }

            @Override
            public void onFailure(Call<Stories> call, Throwable t) {
                resultCallback.onError(t.getMessage());
            }
        });
    }

4. @Query

  @GET("News")
    Call<NewsBean> getItem(@Query("newsId") String newsId, @Query("type") String type);

參數(shù)不確定:

   @GET("News")
    Call<NewsBean> getItem(@QueryMap Map<String, String> map);

參考:
https://blog.csdn.net/lmj623565791/article/details/51304204
http://www.reibang.com/p/7687365aa946
https://blog.csdn.net/c__chao/article/details/78573737
https://gank.io/api

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末允睹,一起剝皮案震驚了整個(gè)濱河市运准,隨后出現(xiàn)的幾起案子幌氮,更是在濱河造成了極大的恐慌,老刑警劉巖胁澳,帶你破解...
    沈念sama閱讀 210,914評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件该互,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡韭畸,警方通過(guò)查閱死者的電腦和手機(jī)宇智,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)胰丁,“玉大人随橘,你說(shuō)我怎么就攤上這事〗跤梗” “怎么了机蔗?”我有些...
    開封第一講書人閱讀 156,531評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)甘萧。 經(jīng)常有香客問(wèn)我蜒车,道長(zhǎng),這世上最難降的妖魔是什么幔嗦? 我笑而不...
    開封第一講書人閱讀 56,309評(píng)論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮沥潭,結(jié)果婚禮上邀泉,老公的妹妹穿的比我還像新娘。我一直安慰自己钝鸽,他們只是感情好汇恤,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著拔恰,像睡著了一般因谎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上颜懊,一...
    開封第一講書人閱讀 49,730評(píng)論 1 289
  • 那天财岔,我揣著相機(jī)與錄音,去河邊找鬼河爹。 笑死匠璧,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的咸这。 我是一名探鬼主播夷恍,決...
    沈念sama閱讀 38,882評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼媳维!你這毒婦竟也來(lái)了酿雪?” 一聲冷哼從身側(cè)響起遏暴,我...
    開封第一講書人閱讀 37,643評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎指黎,沒(méi)想到半個(gè)月后朋凉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,095評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡袋励,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評(píng)論 2 325
  • 正文 我和宋清朗相戀三年侥啤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片茬故。...
    茶點(diǎn)故事閱讀 38,566評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡盖灸,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出磺芭,到底是詐尸還是另有隱情赁炎,我是刑警寧澤,帶...
    沈念sama閱讀 34,253評(píng)論 4 328
  • 正文 年R本政府宣布钾腺,位于F島的核電站徙垫,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏放棒。R本人自食惡果不足惜姻报,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望间螟。 院中可真熱鬧吴旋,春花似錦、人聲如沸厢破。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)摩泪。三九已至笆焰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間见坑,已是汗流浹背嚷掠。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留荞驴,地道東北人叠国。 一個(gè)月前我還...
    沈念sama閱讀 46,248評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像戴尸,于是被迫代替她去往敵國(guó)和親粟焊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評(píng)論 2 348

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