开始在Android上使用Retrofit并创建Http请求客户端

什么是Retrofit

官方对Retrofit的定义是:一个在Android和Java中类型安全的REST客户端
你可以使用注解去描述HTTP请求,URL 参数替换和查询参数这些都默认的得到完整的支持。此外,它还提供了自定义请求头、多种类型请求体、文件上传和下载、模拟相应和其他更多的功能。接下来我们将会看到这些具体是实现详细。

先准备你的安卓项目

在android studio上用Gradle构建你的新项目。当然也可以选择在IDE上用Maven构建项目。

定义依赖库:Gradle or Maven

首先你的项目需要依赖Retrofit。在你所选的编译系统中,在文件build.gradle 或 pom.xml 中导入你所以依赖的指定Retrofit版本,当运行去编译代码的时候,这个编译系统会下载和提供制定的依赖库到你的项目中。

Retrofit2

build.gradle

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

##Android网络权限
用Retrofit进行网络请求需要在AndroidManifest.xml中添加网络权限
```Java
<uses-permission android:name="android.permission.INTERNET" />  ```

##如何描述API端点
首先你需要定义接口和对应的请求方法

##GitHub Client
以下demo定义了GitHubClient接口和reposForUser方法去请求一组仓库贡献者列表数据。其中@GET注解描述了这个请求用了HTTP GET方法。这段demo也阐明了Retrofit路径参数替换的功能用法。这个定义的方法中的{user}路径将会被调用reposForUser方法中的变量值所替换。
```Java
public interface GitHubClient {  
    @GET("/users/{user}/repos")
    Call<List<GitHubRepo>> reposForUser(
        @Path("user") String user
    );
}```
GitHubRepo类定义。这个类包含的必须属性和响应数据一一对应。
```Java
public class GitHubRepo {  
    private int id;
    private String name;

    public GitHubRepo() {
    }

    public int getId() {
        return id;
    }

    public String getName() {
        return name;
    }
}```

关于先前提到的JSON映射:GitHubClient接口定义的返回类型为List<GitHubRepo>的方法。Retrofit 可以确保服务器响应
的数据映射的正确性。(就是返回的响应数据会和被给的类GitHubRepo的数据相对应)
##Retrofit REST 客户端
描述完了API接口和对象模型之后,我们就可以进行真正的请求了。Retrofit的所有请求都是基于1.9或2.0+版本。这两个版本你都可以很流畅的创建和配置API。最后,你可以使用builder来对所有请求设置一些设置一些常用的选项,比如:url或者转换器。

####Retrofit 2
```Java
String API_BASE_URL = "https://api.github.com/";

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

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

Retrofit retrofit =  
    builder
        .client(
            httpClient.build()
        )
        .build();

GitHubClient client =  retrofit.create(GitHubClient.class); 
}```
上面的demo片段使用了最简单的设置选项,还有更多的设置选项让你去控制请求。但是这已经足够我们用来作为第一个请求的列子了。
##JSON 映射
大多数情况下,请求服务器和服务器响应返回数据,都不是用java对象。更多的是用像JSON这种格式的语言来传。
当使用Retrofit 2,你需要向Retrofit对象添加一个转换器,将返回的JSON数据转成对应给的类对象。在build.gradle文件中添加一行下面这个代码,引进Gson转换器给Retrofit 2用。
```Java
compile 'com.squareup.retrofit2:converter-gson:2.1.0'```
当然你也用转换器来转换xml等其他格式的数据,请参考:
[转换器转换其他格式](https://futurestud.io/tutorials/retrofit-2-introduction-to-multiple-converters "")
##Retrofit 的使用
在大量的准备工作之后,现在可以很简便的请求。只用几行demo就可以进行请求
#### Retrofit 2
使用client去获取call对象。只要你用获取的call对象调用.enqueue,请求将会被Retrofit处理。
```Java
// Create a very simple REST adapter which points the GitHub API endpoint.
GitHubClient client =  retrofit.create(GitHubClient.class);

// Fetch a list of the Github repositories.
Call<List<GitHubRepo>> call =  
    client.reposForUser("fs-opensource");

// Execute the call asynchronously. Get a positive or negative callback.
call.enqueue(new Callback<List<GitHubRepo>>() {  
    @Override
    public void onResponse(Call<List<GitHubRepo>> call, Response<List<GitHubRepo>> response) {
        // The network call was a success and we got a response
        // TODO: use the repository list and display it
    }

    @Override
    public void onFailure(Call<List<GitHubRepo>> call, Throwable t) {
        // the network call was a failure
        // TODO: handle error
    }
});```
当调用成功之后,Retrofit 会返回一个方便的List<GitHubRepo>,你可以使用它显示在你的app上。
译至:
[https://futurestud.io/tutorials/retrofit-getting-started-and-android-client](https://futurestud.io/tutorials/retrofit-getting-started-and-android-client"")
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容