首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Kotlin Part 6:API 搭建—Retrofit&Kotlin

如果你还未看本系列文章:请移步:

现在是时候做一个真正的API调用,并证明我们的RxJava的抽象高级的地方!当然要在应用程序中显示一些真实的的消息数据

模拟数据与真实数据我们还没有实现加载更多,但至少我们会看到10条消息,最后还有加载更多功能将会在下一篇文章中实现。

Reddit应用的 API让我们回顾一下我们将要从Reddit使用的API。 目标是如何在应用程序中显示Reddit的TOP新闻。

请求URL

你可以将其粘贴到你的浏览器中,并看到如下所示的内容:

JSON响应child:新闻列表是由10个项目分类的(正如我们在查询字符串中所要求的),每个孩子都有关于新闻的详细信息(姓名,图片,作者等)。

after:它允许你使用这个Reddit API执行分页。

“after”会通过调用“ /top.json?after=t3_4cdt7v ” 来为你带来接下来的10个项目。

Before:与“after”相同,起到返回的作用。一个child包含很多信息:但是我们要挑选其中的某些数据。

RetrofitAndroid和Java的支持类型安全的HTTP客户端Retrofit 是一个令人非常强大的易于使用的库,将你的HTTP API变成一个Java(Kotlin)接口。我们将使用在Reddit API。

依赖

我们需要添加Retrofit依赖项:

JSON转换器另外,我们需要指出Retrofit应该使用哪个转换器将JSON响应转换为Java(Kotlin)类,并且我将使用Moshi,因为它具有比Gson更好的性能

在这里,你可以看到Jake Warthon的一个很棒的视频,他解释了Moshi,Moshi是Okio和它的API,所以它利用了Okio缓冲区,直接读写内容到这个缓冲区,而不需要为这个进程分配额外的内存(把响应数据流转换成Java代码,反之亦然) 。同样,Moshi就像Okio API的更高层次的API,所以你实际上只是在Okio上添加一个更简单的API。

API模型:Kotlin类我们需要创建一些类来将我们的Json响应转换成Kotlin类。如果我们在Java中使用,我们将最终创建具有getter和setter的大型Java文件来做到这一点,但是当我们使用Kotlin时,我们可以利用这一点,并且很容易地代表所有这些类。这是干净简洁的,我可以在这里粘贴代表这些类的所有代码:)

在这里,我们正在映射我们用Kotlin类复习过的以前的模型,并且我们准备好了这4个类。

API接口我创建了一个名为RedditApi的Kotlin文件,它看起来像这样:

interface RedditApi {

@GET("/top.json")

fun getTop(@Query("after") after: String, @Query("limit") limit: String): Call

}

我们在这里定义了一个同步API,它将接收“ after ”和“ limit ”查询字符串。返回类型是“ Call

”,这个Call类将允许我们执行请求,并知道请求是否成功,同时也提取具有给定通用类型的响应数据,在这种情况下,新定义Kotlin类RedditNewsResponse。

Rest API现在我们将把Retrofit初始化移动到一个名为“ RestAPI.kt ” 的新类中。在Kotlin类中,您可以使用init关键字在正文块中初始化您的类。在这里,我们将使用它来初始化RedditApi:

提交:

https://github.com/juanchosaravia/KedditBySteps/commit/8295dfa18896a3ac18757e4c026fa1e7d5ec1600

请确保在AndroidManifest.xml文件中添加此权限:

< uses-permission android:name =“android.permission.INTERNET” />

NewsManager:调用Api!

我们将使用默认参数以这种方式初始化我们的RestApi类:

callResponse.execute():这将同步执行请求。

response.body().data.children。map {...}:这里我们使用List函数“map”将每个item转换成一个RedditNewsItem。it.data:“ data ”是从λ表达式访问单个参数的简便方法。这只有当你只接收一个参数时才有效,否则你必须指定更多的参数,例如有两个参数,看起来像这个“ x,y - > ... ”。

subscriber.onError():我们使用从服务接收到的response.message()创建一个新的Throwable对象。

提交

https://github.com/juanchosaravia/KedditBySteps/commit/2f90d6dc1369b60ad8ea1382764045dcf730ef76

有了这最后的代码变动,我们现在在我们的应用程序中显示来自Reddit的前10个news

总结

到此,我们进一步完善了这个应用程序!Retrofit是一个非常棒的库,当然我们只是使用它的一小部分,可能我会在另一篇文章中写更多关于Retrofit的内容,因为它实际上是一个调用API的超级强大的库。在下一部分中,我们将添加加载更多以从顶部列表中获取更多新闻数据。

下一篇继续学习:第7部分:列表加载更多:高阶函数和limda语法

联系作者:!Twitter:https://twitter.com/juanchosaravia

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180204G0OF1P00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券