Retrofit-开始并创建一个Android客户端

写在开始

因为项目的需要使用到Retrofit,查阅了一些资料后,发现了这个Retrofit使用系列,讲解的十分详细,因为原版是英文的,所以准备翻译成中文的供各位一起交流学习,由于笔者英文水平也就是一般,有些词不达意的地方,烦请谅解,另外,考虑的翻译的“信、达、雅”,可能会有一些句式上的变动。在每章的开始都会给出原版地址,有兴趣的可以直接观看原版。

原文地址

Retrofit — Getting Started and Create an Android Client

什么是Retrofit

官方的主页上描述Retorfit称之为

A type-safe REST client for Android and Java.

你将会使用注解来表示HTTP请求并且默认支持URL参数替换和查询参数。另外,它提供了对于多请求body和文件上传的功能。

怎样声明一个(API)请求

请访问并阅读Retrofit homepage中API声明部分,了解怎么声明一个request,你会发现所有的重要信息通过代码的实例来清晰的表达。

准备你的Android项目

现在让我们重新把手放到键盘上,如果你已经创建了Android项目,直接开始下一段,不然我们先在IDE上建立一个项目,我们推荐使用Gradle来作为构建工具,当然用Maven也是一样的。

定义依赖:Gradle或Maven

现在我们让你的项目依赖Retrofit,选择你的构建系统然后定义Retrofit在你的pom.xml或者Gradle,当使用命令行来build项目时,构建系统会下载并提供library给你的项目,我们提议在使用Retrofit时配合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

使用下面的依赖如果你使用的是Retrofit2版本

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'
}

Retrofit2默认情况下利用OkHttp作为网络层,并建立在之上,你不需要明确的定义OkHttp依赖你的项目,除非你需要一个特别的版本。
现在你的项目已经准备好集成Retrofit,我们可以创建一个持续的Android API/HTTP客户端。

持续性的Android客户端

在对已有的Retrofit研究时,Bart Kiers的sample repository出来了,其实,这是一个OAuth认证的例子,但是,它提供了一个可持续发展的Android客户端的所有必要的基础,这就是为什么我们使用它来作为一个稳定的基础,并且在后面的博客中进行功能的扩展。
下面的类定义了我们客户端的基础:ServiceGenerator

Service Generator

这个 Service Generator 是我们API/HTTP的核心。在当前状态下,它只定义了一个方法去创建一个基本的对于给定的class/interface的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来根据一个给定的base url创建一个REST client。举个例子,Github的API base url就是 https://api.github.com/

serviceClass 定义了一个API请求注解类或接口。以下的部分展示了具体的Retrofit的使用,以及如何定义一个示范的client。

Json映射

Retrofit 1.9默认附带google的GSON解析,你需要定义一个返回对象的类然后这个返回会自动映射,当使用Retrofit 2,你需要添加一个明确的映射转换给Retrofit,在上面,我们已经在 build.gradle 中引入了GSON的转换器

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

现在你需要添加一个转换器给Retrofit对象,需要调用 .addConverterFactory(GsonConverterFactory.create()) 在Builder中将GSON作为默认的转换器。

译者注: 除了gson之外 一般使用fastjson的用户也是有对应的转换器 需要导入 compile 'org.ligboy.retrofit2:converter-fastjson-android:2.1.0'

使用Retrofit

好,我们开始面对这个例子并且定义一个RSET client来从github上请求数据,首先,我们先得创建一个interface并且定义需要的方法

GitHub Client

下面的代码定义了一个GithubClient和一个方法来请求一个contributors的列表,这也示例了参数的替换功能(这个owner和repo参数会被请求时的参数所替代)

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
    );
}

下面定义了一个class Contributor 这个类的组成需要属性去映射返回的数据

static class Contributor {  
    String login;
    int contributions;
}

至于先前提到的JSON映射,GithubClient定义了一个 contributors 方法返回了一个List<Contributor>,只要匹配到给定的类,Retrofit能确保服务端的返回会映射成功。

API 请求示例

下面的代码片段示例了 ServiceGenerator 的使用来实例化具体的GithubClient,并且通过方法调用来获取contributors ,这个片段是改进过的示例代码
你需要手动给 ServiceGenerator 定义一个base url "https://api.github.com/" ,另外还要创建一个 createService 来接收两个参数:client class 和 base 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 + ")");
    }
}
引用文章
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容