Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Android SDK
Code

开始使用Retrofit 2 HTTP 客户端

by
Difficulty:IntermediateLength:LongLanguages:

Chinese (Simplified) (中文(简体)) translation by Zuojianzifu 作茧自缚 (you can also view the original English article)

Final product image
What You'll Be Creating
Final product image
你将要创建什么

Retrofit是什么?

Retrofit是Android和Java的类型安全的HTTP客户端。 通过将API转换为Java接口,Retrofit可以轻松连接到REST Web服务。 在本教程中,我将向您展示如何使用Android最流行的和经常被推荐的HTTP库之一。

这个强大的库可以轻松地使用JSON或XML数据,然后将其解析为普通Java对象(POJO)。 GETPOSTPUT, PATCH和 DELETE 请求都可以执行。

像大多数开源软件一样,Retrofit是建立在其他一些强大的库和工具之上的。 在底层,Retrofit利用OkHttp(来自同一开发人员)来处理网络请求。 此外,Retrofit没有内置的任何JSON转换器来解析JSON转换到Java对象。 相反,它支持以下JSON转换器库来处理:

  • Gson: com.squareup.retrofit:converter-gson
  • Jackson: com.squareup.retrofit:converter-jackson
  • Moshi: com.squareup.retrofit:converter-moshi
  • Protobuf: com.squareup.retrofit2:converter-protobuf
  • Wire: com.squareup.retrofit2:converter-wire

并且对于XML,Retrofit 支持:

  • Simple Framework: com.squareup.retrofit2:converter-simpleframework

那么为什么使用 Retrofit呢?

开发自己的类型安全的HTTP库与REST API接口可能是一个非常痛苦的事情:您必须处理许多功能,例如进行连接,缓存,重试失败的请求,线程,响应解析,错误处理等。 另一方面,Retrofit是非常有组织结构的、文档详尽,并且已经接受了检测--实战级别检测的库将节省你很多宝贵的时间和一些头疼的事情。

在本教程中,我将通过使用Stack Exchange API构建一个简单的查询最近的答案的应用程序来解释如何使用Retrofit 2处理网络请求。 我们将通过指定/answers来执行GET请求,附加到基础URL https://api.stackexchange.com/2.2/,然后获取结果并将其显示在recycler视图中。 我也将向您展示如何使用RxJava来简化管理状态和数据流程。

1.创建Android Studio工程

启动Android Studio并创建一个名为MainActivity空活动的新项目。

Create a new empty activity

2.声明依赖

创建新项目后,在build.gradle中声明以下依赖关系。 依赖关系包括recycler视图,Retrofit库,以及Google的Gson库,用于将JSON转换为POJO(普通Java对象)以及Retrofit的Gson集成。

不要忘记同步项目以便下载这些库。

3.添加Internet权限

要执行网络操作,我们需要在应用程序清单AndroidManifest.xml中包含INTERNET权限:。

4.自动生成模型

我们将通过利用非常有用的工具jsonschema2pojo从我们的JSON响应数据自动创建我们的模型。

获取示例JSON数据

在浏览器的地址栏中复制并粘贴https://api.stackexchange.com/2.2/answers?order=desc&sort=activity&site=stackoverflow(或者如果您熟悉Postman,您可以使用该工具)。 然后按Enter键,这将在给定的端点上执行GET请求。 您将看到的响应是一组JSON对象。 下面的截图是使用Postman响应的JSON

API response to GET request

从浏览器或 Postman复制此响应JSON。

将JSON数据映射到Java

现在访问jsonschema2pojo并将JSON响应粘贴到输入框中。

选择JSON的源类型,Gson的注释样式,然后取消选中“允许其他属性(Allow additional properties)

jsonschema2pojo interface

然后单击“预览(Preview)”按钮以生成Java对象。

jsonschema2pojo output

您可能想知道在此生成的代码中@SerializedName@Expose注释所做的工作。 别担心,我会解释一切!

Gson需要使用注释@SerializedName来将JSON键与我们的字段进行映射。 对于类成员属性,根据Java的驼峰命名惯例,不建议使用下划线来分隔变量中的单词。 @SerializedName有助于在两者之间进行翻译。

在上面的例子中,我们告诉Gson:JSON键quota_remaining应该映射到Java字段quotaRemaining。 如果这两个值都相同,即如果我们的JSON键是像Java字段一样是quotaRemaining,那么在该字段上不需要@SerializedName注释,因为Gson会自动映射它们。

注释@Expose表明该成员应该被公开为JSON序列化或反序列化。

将数据模型导入Android Studio

现在让我们回到Android Studio。 在主包中创建一个新的子包,并将其命名为data(数据)。 在新创建的数据包内,创建另一个包并将其命名为model(模型)。 在model包中,创建一个新的Java类并将其命名为Owner。 现在复制由jsonschema2pojo生成的Owner类,并将其粘贴到您创建的Owner类中。

对于从jsonschema2pojo复制的新Item类执行相同的操作。

最后,为返回的StackOverflow答案创建一个名为SOAnswersResponse的类。 您将在jsonschema2pojo中找到此类的代码作为示例。 无论发生在何处,确保将类名更新为SOAnswersResponse。

5.创建Retrofit实例

要使用Retrofit向REST API发出网络请求,我们需要使用Retrofit.Builder类创建一个实例,并使用基URL进行配置。

data包中创建一个新的子包,并将其命名为remote。 在remote里面,创建一个Java类并将其命名为RetrofitClient。 这个类将创建Retrofit单例。 Retrofit需要一个基URL来构建其实例,所以当调用RetrofitClient.getClient(String baseUrl)时,我们将传递一个URL。 然后,该URL将用于构建第13行中的实例。 我们还在第14行中指定了我们需要的JSON转换器(Gson)。

6.创建API接口

remote包中,创建一个接口并命名为SOService。 此接口包含我们将要用于执行比如GETPOSTPUTPATCHDELETE的HTTP请求。 对于本教程,我们将执行GET请求。

注解@GET显式定义了一旦该方法被调用将执行的GET请求。 此接口中的每个方法必须具有提供请求方法和相对URL的HTTP注解。 有五个内置注解可用:@GET@POST@PUT@DELETE@HEAD

在第二种方法定义中,我们添加了一个查询参数,用于过滤服务器中的数据。 Retrofit具有@Query(“key”)注释,而不是在端点中进行硬编码。 键值表示URL中的参数名称。 它将被Retrofit添加到URL。 例如,如果我们将值“android”作为参数传递给getAnswers(String tags)方法,则完整的URL将是:

接口方法的参数可以具有以下注解:

@Path 可变替代API端点
@Query 使用带注释的参数的值指定查询键名称
@Body POST请求的有效载荷
@Header 使用带注解的参数值指定头部

7.创建API 工具类

现在要创建一个实用程序类。 我们将其命名为ApiUtils。 该类将使用基URL作为静态变量,并通过getSOService()静态方法为我们的应用程序提供SOService接口。

8.显示到RecyclerView

由于结果将显示在recycler视图中,因此我们需要一个适配器。 以下代码片段展示了AnswersAdapter类。

9.执行请求

MainActivityonCreate()方法中,我们初始化SOService接口(第9行),recycler view以及适配器的实例。 最后,我们调用loadAnswers()方法。

loadAnswers()方法通过调用enqueue()来进行网络请求。 当响应返回时,Retrofit可帮助我们将响应的JSON解析为Java对象列表。 (这可以通过使用GsonConverter来实现)

10.理解enqueue()

enqueue()异步地发送请求,并在响应返回时使用回调通知您的应用程序。 由于此请求是异步的,所以Retrofit使用后台线程处理请求,以便主UI线程不被阻塞或干扰。

要使用enqueue(),你必须实现两个回调方法:

  • onResponse()
  • onFailure()

对于给定请求的响应,只能有这其中的一个方法被调用。

  • onResponse():为接收的HTTP响应调用。 对于能正确处理的响应,即使返回一个错误信息这个方法也会被调用。 所以如果你得到一个404或500的状态码,这个方法仍然会被调用。 为了根据不同状态码来处理不同的情况,可以使用response.code()方法来获取该状态码。 您还可以使用isSuccessful()方法来查找状态代码是否在200-300范围内,这表示成功完成了请求。
  • onFailure():当与服务器通信时发生网络异常或处理请求或处理响应时发生意外异常时,此方法将会被调用。

如果要执行同步请求,可以使用execute()方法。 请注意,主/ UI线程上的同步方法将阻止用户的任何操作。 所以千万不要在Android的主/ UI线程上执行同步方法! 而是在后台线程上运行它们。

11.测试应用程序

您现在可以运行该应用程序。

Sample results from StackOverflow

12. 集成RxJava

如果您是RxJava的粉丝,您可以轻松地使用RxJava实现Retrofit。 在Retrofit 1中,它默认是集成的,但在Retrofit 2中,您需要包含一些额外的依赖关系。 Retrofit有一个用于执行Call实例的默认适配器。 因此,您可以通过引入RxJava CallAdapter来更改Retrofit的执行机制,这将在Retrofit引入RxJava。

第1步

添加依赖关系。

第2步

在构建Retrofit实例时使用RxJavaCallAdapterFactory.create()添加新的CallAdapter 。

第3步

在发送请求时,我们匿名订阅者响应于被观察者流发送的事件,在我们的示例下为SOAnswersResponse。 当我们的订阅者收到发送的任何事件,然后该事件传递给我们的适配器时,将会调用onNext方法。

查看Ashraff Hathibelagal撰写的Android:ReactiveX入门来了解更多关于RxJava和RxAndroid的信息。

结论

在本教程中,您学习了Retrofit:为什么要使用它,以及如何使用它。 我还解释了如何添加RxJava与Retrofit的集成。 在我的下一篇文章中,我将向您展示如何执行POSTPUTDELETE,如何发送Form-Urlencoded数据以及如何取消请求。

要了解有关Retrofit的更多信息,请参阅官方文档。 在此期间,请查看我们其他有关Android应用程序开发的其他课程和教程。

关注我们的公众号
Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.