android - Kotlin - 使用 RxJava 的改造请求给出空响应
问题描述
我正在尝试从 Guardian API 获取新闻。我得到空响应,一切都在下面。我正在使用 Kotlin、Retrofit 和 RxJava。我知道有一些被误称为变量/对象的变量/对象,但是当我摆脱这个问题时,我会改变它们。
改造界面
@get:GET("search?api-key=test")
val news:Observable<News>
改造客户端
val instance : Retrofit
get() {
if (myInstance == null) {
myInstance = Retrofit.Builder()
.baseUrl("https://content.guardianapis.com/")
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build()
}
return myInstance!!
}
并在我加载数据的地方工作
private fun loadUrlData() {
compositeDisposable.add(jsonApi.news
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe{news -> displayData(news)})
}
JSON 示例
{
response:{
status:"ok",
userTier:"developer",
total:2063064,
startIndex:1,
pageSize:10,
currentPage:1,
pages:206307,
orderBy:"newest",
results:[
{
id:"politics/2018/sep/24/keir-starmer-labour-does-not-rule-out-remaining-in-eu",
type:"article",
sectionId:"politics",
sectionName:"Politics",
webPublicationDate:"2018-09-24T18:57:48Z",
webTitle:"Keir Starmer: Labour does not rule out remaining in EU as option",
webUrl:"https://www.theguardian.com/politics/2018/sep/24/keir-starmer-labour-does-not-rule-out-remaining-in-eu",
apiUrl:"https://content.guardianapis.com/politics/2018/sep/24/keir-starmer-labour-does-not-rule-out-remaining-in-eu",
isHosted:false,
pillarId:"pillar/news",
pillarName:"News"
}
]
}
}
模型类
data class News( val status: String, val userTier: String, val total: Int, val startIndex: Int, val pageSize: Int, val currentPage: Int, val pages: Int, val orderBy: String, val results: List<Result>)
我想问题出在最后一个函数或接口上,但我找不到解决方案。
解决方案
问题在于您的数据模型类。
您的 JSON 有一个外部节点 ( response
),如果您尝试返回 aNews
您将不会得到它,因为Retrofit
无法将 JSON 映射到News
类。添加一个名为的外部类,该类Response
包含一个名为 response 的字段,该字段的类型为News
,应该修复它。
像这样:
class Response(val response: News)
注意:我没有data
在班级前面添加,因为您不一定需要它。关键字只是自动为您添加一些额外的data
东西,例如toString()
和equals()
,hashCode()
但除非您实际上将它们用于任何事情,否则我不建议添加data
关键字,因为它非常无用。
推荐阅读
- python - Snakemake - 如何使用输入文件的每一行作为通配符
- javascript - 如何创建嵌套存储管道?
- c - 使用 libnl 更改网桥标志
- swift - 错误:`'(@lvalue String) -> Text' 在 SwiftUI 中不可转换为 '(String) -> Text'`
- npm - 如何在 BigCommerce Stencil 主题中使用 Select2
- javascript - 如何让具有相同类名的元素在 javascript 中执行相同的功能?
- crash - 即使在使用小数据集后,如何解决在使用可用 RAM 后在 google colab 中会话崩溃的问题
- python - Pandas:.loc 没有将一个数据帧的行分配给另一个数据帧的切片行
- java - 重写和重载的方法
- mongodb - mongodb logpath 文件夹权限更改