首页 > 解决方案 > 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>)

我想问题出在最后一个函数或接口上,但我找不到解决方案。

标签: androidkotlinrx-javaretrofitrx-android

解决方案


问题在于您的数据模型类。

您的 JSON 有一个外部节点 ( response),如果您尝试返回 aNews您将不会得到它,因为Retrofit无法将 JSON 映射到News类。添加一个名为的外部类,该类Response包含一个名为 response 的字段,该字段的类型为News,应该修复它。

像这样:

class Response(val response: News)

注意:我没有data在班级前面添加,因为您不一定需要它。关键字只是自动为您添加一些额外的data东西,例如toString()equals()hashCode()但除非您实际上将它们用于任何事情,否则我不建议添加data关键字,因为它非常无用。


推荐阅读