Retrofit系列文章翻譯1—開始創(chuàng)建android客戶端

原文鏈接:https://futurestud.io/blog/retrofit-getting-started-and-android-client
本文是Retrofit系列文章的第一篇。本系列深入挖掘幾個使用案例并討論了Retrofit的功能和擴展性澈驼。

Retrofit 系列目錄

  1. 開始創(chuàng)建android客戶端
  2. Android上的基本認證[已翻譯]
  3. Android上的令牌認證[已翻譯]
  4. Android上的OAuth
  5. 多個 Query 參數(shù)使用同一名字[已翻譯]
  6. 同步與異步請求[已翻譯]
  7. 在請求體里發(fā)送對象[已翻譯]
  8. 自定義一個響應(yīng)轉(zhuǎn)換器[已翻譯]
  9. 添加自定義請求頭
  10. 可選的 Query 參數(shù)
  11. 如何集成 XML 轉(zhuǎn)換器
  12. 使用 Log Level 調(diào)試請求
  13. 如何上傳文件
  14. Series Round-Up
  15. Retrofit 2 — 1.9 升級指南
  16. Retrofit 2 — 如何上傳文件
  17. Retrofit 2 — Log 請求與響應(yīng)
  18. Retrofit 2 — Android 上的 Hawk 認證
  19. Retrofit 2 — 簡單錯誤處理
  20. 如何在 Retrofit 1 里使用 OkHttp 3
  21. Retrofit 2 — 圖書更新發(fā)布慶典
  22. 提交表單數(shù)據(jù) — Urlencoded
  23. 提交表單數(shù)據(jù) — Urlencoded 使用FieldMap
  24. Retrofit 2 — 在 OkHttp 攔截器里管理請求頭部
  25. Retrofit 2 — 如何給每一個請求添加 Query 參數(shù)
  26. Retrofit 2 — 使用QueryMap 添加多個 Query 參數(shù)
  27. Retrofit 2 — 如何在請求時使用動態(tài) Url
  28. Retrofit 2 — Url 處理,分辨和解析
  29. Retrofit 2 — POST 和PUT 請求里的常量, 默認值和邏輯值
  30. Retrofit 2 — 如何下載文件
  31. Retrofit 2 — 取消請求
  32. Retrofit 2 — 重用分析請求
  33. Retrofit 2 — 如何在運行時修改 API Base Url
  34. 可選Path參數(shù)
  35. 如何刷新 Access Token
  36. Retrofit 2 — 如何提交文本請求體
  37. Retrofit 2 — 使用 Query 參數(shù)來分頁
  38. Retrofit 2 — 使用 鏈接頭和動態(tài) Url 來分頁(比如GitHub)
  39. Retrofit 2 — 使用范圍頭字段來分頁 (比如 Heroku)
  40. Retrofit 2 — 轉(zhuǎn)換器介紹
  41. Retrofit 2 — 添加并自定義 Gson 轉(zhuǎn)換器
  42. Retrofit 2 — 實現(xiàn)自定義轉(zhuǎn)換器
  43. Retrofit 2 — 只在開發(fā)環(huán)境里啟用日志
  44. Retrofit 2 — 如何上傳多個文件
  45. Retrofit 2 — Passing Multiple Parts Along a File with @PartMap
  46. Retrofit 2 — 模仿服務(wù)端響應(yīng)基本概念
  47. Retrofit 2 — 模仿服務(wù)端響應(yīng)自定義網(wǎng)絡(luò)行為
  48. Retrofit 2 — 使用 @HeaderMap 定義動態(tài)請求頭

在本篇博客里我們將瀏覽 Retrofit 的基本概念灼伤,并創(chuàng)建 android 客戶端用來做 HTTP 請求.
但是請記住我們不會介紹過多入門知識和 Retrofit 是什么. 想知道更多請訪問官網(wǎng).

Retrofit 是什么

官網(wǎng)介紹如下:

A type-safe REST client for Android and Java.
(目前已改為A type-safe **HTTP client **for Android and Java,譯者注)

你將使用注解來描述 HTTP 請求, URL 參數(shù)替換迄损, 默認集成query 參數(shù)支持. 除此而外, 它還提供Multipart請求和文件上傳的功能.

如何聲明 (API) 請求

請訪問 Retrofit 主頁并閱讀 API 聲明部分來理解并找到如何做請求的感覺 . 在此你將發(fā)現(xiàn)所有重要信息坑质,它們在代碼示例里被清晰的描述.

準備你的 Android 項目

現(xiàn)在讓我們把手放到鍵盤上患雇。如果已經(jīng)創(chuàng)建過了Android項目,那么請繼續(xù)閱讀下一章節(jié)淮野。否則捧书,請使用你最喜歡的IDE創(chuàng)建一個新項目。我們傾向于使用 Gradle 做為構(gòu)建系統(tǒng)骤星,不過當(dāng)然你也可以繼續(xù)使用 Maven经瓷。

定義依賴: Gradle 或者 Maven

現(xiàn)在讓我們將 Retrofit 設(shè)為項目的一個依賴. 選擇你使用的構(gòu)建系統(tǒng)并在 pom.xml 或者build.gradle里定義 Refrofit 和它的依賴. 當(dāng)執(zhí)行構(gòu)建命令代碼時, 構(gòu)建系統(tǒng)將會下載并提供你項目的庫. 我們建議使用 Retrofit 聯(lián)合 OkHTTP, 它需要 Okio 做為依賴.

Retrofit 1.9

pom.xml

<dependency>  
    <groupId>com.squareup.retrofit</groupId>
    <artifactId>retrofit</artifactId>
    <version>1.9.0</version>
</dependency>  
<dependency>  
    <groupId>com.squareup.okhttp</groupId>
    <artifactId>okhttp</artifactId>
    <version>2.7.2</version>
</dependency>

build.gradle

dependencies {  
    // Retrofit & OkHttp
    compile 'com.squareup.retrofit:retrofit:1.9.0'
    compile 'com.squareup.okhttp:okhttp:2.7.2'
}

Retrofit 2

如果你使用的 Retrofit 版本2 ,請使用如下依賴:
pom.xml

<dependency>  
    <groupId>com.squareup.retrofit2</groupId>
    <artifactId>retrofit</artifactId>
    <version>2.1.0</version>
</dependency>  
<dependency>  
    <groupId>com.squareup.retrofit2</groupId>
    <artifactId>converter-gson</artifactId>
    <version>2.1.0</version>
</dependency>

build.gradle

dependencies {  
    // Retrofit & OkHttp
    compile 'com.squareup.retrofit2:retrofit:2.1.0'
    compile 'com.squareup.retrofit2:converter-gson:2.1.0'
}

Retrofit 2 默認情況下利用OkHttp作為網(wǎng)絡(luò)層,是構(gòu)建在它之上. 你不必顯式定義 OkHttp 作為你項目的依賴, 除非你需要它的特定版本.

既然你的項目已經(jīng)準備好集成 Retrofit, 那么讓我們創(chuàng)建一個持久的 Android API/HTTP 客戶端.

可持續(xù)Android客戶端

在研究目前已有的 Retrofit 客戶端過程中, 出現(xiàn)了 Bart Kiers 的例子庫. 實際上他是關(guān)于用 Retrofit OAuth 認證的例子. 無論如何洞难,它提供了一個可持續(xù)發(fā)展的Andr??oid客戶端所有必要的基礎(chǔ)知識. 這就是為什么我們把它作為一個穩(wěn)定的基礎(chǔ)舆吮,并在未來的博客中做進一步的認證功能擴展.
接下來的類定義了我們android客戶端的基礎(chǔ): ServiceGenerator.

Service Generator

ServiceGenerator 是我們 API/HTTP 客戶端的核心. 當(dāng)前, 它只定義了一個方法, 就是給已有的類/接口創(chuàng)建基本的 REST 適配器. 代碼如下:

Retrofit 1.9

public class ServiceGenerator {

    public static final String API_BASE_URL = "http://your.api-base.url";

    private static RestAdapter.Builder builder = new RestAdapter.Builder()
                .setEndpoint(API_BASE_URL)
                .setClient(new OkClient(new OkHttpClient()));

    public static <S> S createService(Class<S> serviceClass) {
        RestAdapter adapter = builder.build();
        return adapter.create(serviceClass);
    }
}

Retrofit 2

public class ServiceGenerator {

    public static final String API_BASE_URL = "http://your.api-base.url";

    private static OkHttpClient.Builder httpClient = new OkHttpClient.Builder();

    private static Retrofit.Builder builder =
            new Retrofit.Builder()
                    .baseUrl(API_BASE_URL)
                    .addConverterFactory(GsonConverterFactory.create());

    public static <S> S createService(Class<S> serviceClass) {
        Retrofit retrofit = builder.client(httpClient.build()).build();
        return retrofit.create(serviceClass);
    }
}

ServiceGenerator 類使用 Retrofit 的 RestAdapter-Builder 結(jié)合提供的 API_BASE_URL來創(chuàng)建一個新的 REST 客戶端. 比如, GitHub 的 API_BASE_URLhttps://api.github.com/. serviceClass 定義API請求注解類或接口. 下面的章節(jié)將顯示 Retrofit 的具體使用和如何定義一個示范客戶端.

JSON 映射

Retrofit 1.9 默認附帶 Google的 GSON 庫. 你需要做的就是定義你響應(yīng)對象的類, 然后響應(yīng)將被自動映射.

然而到了 Retrofit 2, 你需要顯示添加一個轉(zhuǎn)換器到 Retrofit 對象上. 前面,我們已經(jīng)添加下列行到 build.gradle 文件來導(dǎo)入 Retrofit 2的 GSON 轉(zhuǎn)換器.

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

現(xiàn)在你需要給你的 Retrofit 對象添加轉(zhuǎn)換. 在Retrofit 的 builder 調(diào)用 .addConverterFactory(GsonConverterFactory.create()) 來集成 GSON 作為默認的 JSON 轉(zhuǎn)換器.

Retrofit 實例

好吧,讓我們面對一個例子队贱,定義一個從GitHub請求數(shù)據(jù)的REST客戶端. 首先, 我們必須創(chuàng)建接口并定義需要的方法.

GitHub 客戶端

下面的代碼定義了 GitHubClient接口, 接口定義了一個請求存儲庫貢獻者列表的方法. 這也顯示了 Retrofit 的參數(shù)替換功能的使用 (路徑中的{owner} 和{repo} 在調(diào)用對象方法時將會被給定的變量替換).

Retrofit 1.9

public interface GitHubClient {  
    @GET("/repos/{owner}/{repo}/contributors")
    List<Contributor> contributors(
        @Path("owner") String owner,
        @Path("repo") String repo
    );
}

Retrofit 2

public interface GitHubClient {  
    @GET("/repos/{owner}/{repo}/contributors")
    Call<List<Contributor>> contributors(
        @Path("owner") String owner,
        @Path("repo") String repo
    );
}

這是定義的 Contributor 類. 這個類包含所需的類屬性來映射響應(yīng)數(shù)據(jù).

static class Contributor {  
    String login;
    int contributions;
}

至于先前提到的JSON映射:GitHubClient 定義了返回類型為 List<Contributor>的方法 contributors . Retrofit 確保服務(wù)器的響應(yīng)被正確的映射(響應(yīng)匹配給定的類).

API 請求示例

下面的片段顯示了 ServiceGenerator 的用法, 實例化客戶端(具體來說是GitHub 客戶端), 和用創(chuàng)建的 client 得到貢獻者的方法調(diào)用. 這個片段是所提供的 Retrofit github客戶端示例的修改后版本.
當(dāng)執(zhí)行GitHub 示例時, 你需要在ServiceGenerator接口手動定義基本url為 "https://api.github.com/". 另一種方法是再創(chuàng)建一個 createService()
方法, 接受兩個參數(shù): client 類和基本 url.

Retrofit 1.9

public static void main(String... args) {  
    // Create a very simple REST adapter which points the GitHub API endpoint.
    GitHubClient client = ServiceGenerator.createService(GitHubClient.class);

    // Fetch and print a list of the contributors to this library.
    List<Contributor> contributors =
        client.contributors("fs_opensource", "android-boilerplate");

    for (Contributor contributor : contributors) {
        System.out.println(
                contributor.login + " (" + contributor.contributions + ")");
    }
}

Retrofit 2

public static void main(String... args) {  
    // Create a very simple REST adapter which points the GitHub API endpoint.
    GitHubClient client = ServiceGenerator.createService(GitHubClient.class);

    // Fetch and print a list of the contributors to this library.
    Call<List<Contributor>> call =
        client.contributors("fs_opensource", "android-boilerplate");

    try {
        List<Contributor> contributors = call.execute().body();
    } catch (IOException e) {
        // handle errors
    }

    for (Contributor contributor : contributors) {
        System.out.println(
                contributor.login + " (" + contributor.contributions + ")");
    }
}

接下來做什么

接下來的章節(jié)介紹了如何使用 Retrofit 完成基本身份認證. 我們將展示代碼例子使用用戶名/電子郵件和密碼來驗證web服務(wù)或api. 此外色冀,以后的文章將涵蓋令牌(其中包括OAuth)API認證.
我們希望你喜歡這個概述,以及如何使用 Retrofit 完成你的第一個請求:)

附加資源

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末柱嫌,一起剝皮案震驚了整個濱河市锋恬,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌编丘,老刑警劉巖与学,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異瘪吏,居然都是意外死亡,警方通過查閱死者的電腦和手機蜗巧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門掌眠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人幕屹,你說我怎么就攤上這事蓝丙〖对猓” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵渺尘,是天一觀的道長挫鸽。 經(jīng)常有香客問我,道長鸥跟,這世上最難降的妖魔是什么丢郊? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮医咨,結(jié)果婚禮上枫匾,老公的妹妹穿的比我還像新娘。我一直安慰自己拟淮,他們只是感情好干茉,可當(dāng)我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著很泊,像睡著了一般角虫。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上委造,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天戳鹅,我揣著相機與錄音,去河邊找鬼争涌。 笑死粉楚,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的亮垫。 我是一名探鬼主播模软,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼饮潦!你這毒婦竟也來了燃异?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤继蜡,失蹤者是張志新(化名)和其女友劉穎回俐,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體稀并,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡仅颇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了碘举。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片忘瓦。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖引颈,靈堂內(nèi)的尸體忽然破棺而出耕皮,到底是詐尸還是另有隱情境蜕,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布凌停,位于F島的核電站粱年,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏罚拟。R本人自食惡果不足惜台诗,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望舟舒。 院中可真熱鬧拉庶,春花似錦、人聲如沸秃励。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽夺鲜。三九已至皆尔,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間币励,已是汗流浹背慷蠕。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留食呻,地道東北人流炕。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像仅胞,于是被迫代替她去往敵國和親每辟。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,916評論 2 344

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