Kotlin-使用RxJava的改造请求给出空响应

时间:2018-09-24 19:08:24

标签: android kotlin rx-java retrofit rx-android

我正在尝试从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>)

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

1 个答案:

答案 0 :(得分:0)

问题出在您的数据模型类之内。

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

像这样:

class Response(val response: News)

注意:由于您不一定需要data,所以我没有在课程前面添加datatoString()关键字只是自动为您添加了一些额外的内容,例如equals()hashCode()data,但是除非您实际上将它们用于其他用途,否则我不推荐添加def find_correct(words_dict): count=0 for key,value in words_dict.items(): for val, ky in zip(value, key): if(val!=ky): count+=1 return count 关键字,因为那样就没用了。