Hi im unable to parse data here is base url https://api.rss2json.com/v1/api.json?rss_url=http://www.abc.net.au/news/feed/51120/rss.xml/
here is my code -->
@GET("/api.json")
fun getNewTestFeeds(@Query( "rss_url") query :String) : Response<List<Model>>
companion object{
val BASEURL = "https://api.rss2json.com/v1/"
rss_url=http://www.abc.net.au/news/feed/"
var retrofitService : RetrofitService? = null
fun getInstance(): RetrofitService{
if (retrofitService ==null){
val retrofit = Retrofit.Builder()
.baseUrl(BASEURL)
.addConverterFactory(GsonConverterFactory.create())
.addConverterFactory(SimpleXmlConverterFactory.create())
.build()
retrofitService = retrofit.create(RetrofitService::class.java)
}
return retrofitService!!
}
}
and my repository
suspend fun getTestFeeds() =
retrofitService.getAllFeeds("http://www.abc.net.au/news/feed/51120/rss.xml")
and my viewmodel
fun getAllFeeds(){
CoroutineScope(Dispatchers.IO).launch {
loading.postValue(true)
val response = mainRepository.getTestFeeds()//getAllFeeds()
withContext(Dispatchers.Main){
if (response.isSuccessful){
feedList.postValue(response.body())
loading.value = false
}else
Log.i(TAG, "getAllFeeds:" +
" ${response.message()} and ${response.body().toString()}" +
" errorbody ${response.errorBody().toString()}")
onError("Error :response.message()}")
}
}
}
@GET("/api.json")
fun getNewTestFeeds(@Query( "rss_url") query :String) : Response<List<Model>>
The response from the api is an object but you are expecting the list.
Use https://www.json2kotlin.com/ to generate the data class from the json and follow the response structure. It should be just Response<SomeModel>
not Response<List<Model>>
You request returns JsonObject not array so it's should not be list.
{
"status": "ok",
"feed": {
"url": "http://www.abc.net.au/news/feed/51120/rss.xml",
"title": "Just In",
"link": "https://www.abc.net.au/news/justin/",
"author": "",
"description": "",
"image": "https://www.abc.net.au/news/image/8413416-1x1-144x144.png"
},
"items": [{}]
}
so declare your response class like below
class ResponseClass{
val status : String
val feed : YourFeedModel
val items : List<YourItemModel>
}
And request should be
@GET("/api.json")
fun getNewTestFeeds(@Query( "rss_url") query :String) : Response<ResponseClass>
First according on your response from api your response start with object not array then your serializable is wrong
@GET("/api.json")
fun getNewTestFeeds(@Query( "rss_url") query :String) : Response<List<Model>>
this class of object response
data class ResponseClass(val status : String,val feed : YourFeedModel, val items : List<YourItemModel>)
so your function getNewTestFeeds
like this
@GET("/api.json")
fun getNewTestFeeds(@Query( "rss_url") query :String) :
Response<ResponseClass>
then move repository file you use wrong name of method you must call this method like this
suspend fun getTestFeeds() =
retrofitService.getNewTestFeeds("http://www.abc.net.au/news/feed/51120/rss.xml")
then on viewModel you want set list on live data
fun getAllFeeds(){
CoroutineScope(Dispatchers.IO).launch {
loading.postValue(true)
val response = mainRepository.getTestFeeds()//getAllFeeds()
withContext(Dispatchers.Main){
if (response.isSuccessful){
feedList.postValue(response.body().items) // response.body() return class response you can get list from class to set it on livedata
loading.value = false
}else
Log.i(TAG, "getAllFeeds:" +
" ${response.message()} and ${response.body().toString()}" +
" errorbody ${response.errorBody().toString()}")
onError("Error :response.message()}")
}
}
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.