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 关键字,因为它没有用。