Kotlin - 使用 RxJava 的改造请求给出空响应
Kotlin - Retrofit request using RxJava gives null response
我正在尝试从 Guardian API 获取新闻。我收到空响应,一切都在下面。我正在使用 Kotlin、Retrofit 和 RxJava。我知道有一些叫错了 variables/objects 但我会在解决这个问题时更改它们。
改造界面
@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"
}
]
}
}
型号class
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>)
我想问题出在最后一个函数或界面上,但我找不到解决方案。
问题出在您的数据模型中 class。
你的 JSON 有一个外部节点 (response
),如果你试图 return 一个 News
你不会得到它,因为 Retrofit
无法将 JSON 映射到 News
class。添加一个名为 Response
的外部 class,它包含一个名为 response 的字段,类型为 News
,应该可以修复它。
像这样:
class Response(val response: News)
注意:我没有在 class 前面添加 data
,因为您不一定需要它。 data
关键字只是自动为你添加一些额外的东西,比如 toString()
、equals()
和 hashCode()
,但除非你真的将它们用于任何我不推荐的东西添加 data
关键字,因为它没有用。
我正在尝试从 Guardian API 获取新闻。我收到空响应,一切都在下面。我正在使用 Kotlin、Retrofit 和 RxJava。我知道有一些叫错了 variables/objects 但我会在解决这个问题时更改它们。
改造界面
@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"
}
]
}
}
型号class
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>)
我想问题出在最后一个函数或界面上,但我找不到解决方案。
问题出在您的数据模型中 class。
你的 JSON 有一个外部节点 (response
),如果你试图 return 一个 News
你不会得到它,因为 Retrofit
无法将 JSON 映射到 News
class。添加一个名为 Response
的外部 class,它包含一个名为 response 的字段,类型为 News
,应该可以修复它。
像这样:
class Response(val response: News)
注意:我没有在 class 前面添加 data
,因为您不一定需要它。 data
关键字只是自动为你添加一些额外的东西,比如 toString()
、equals()
和 hashCode()
,但除非你真的将它们用于任何我不推荐的东西添加 data
关键字,因为它没有用。