#android #api #kotlin #retrofit2
Вопрос:
У меня проблема с моим проектом. Это простое подключение к приложению api. Я хочу получить такую информацию:
{ "docs": [ { "_id": "5cf5805fb53e011a64671582", "name": "The Fellowship Of The Ring" }, { "_id": "5cf58077b53e011a64671583", "name": "The Two Towers" }, { "_id": "5cf58080b53e011a64671584", "name": "The Return Of The King" } ], "total": 3, "limit": 1000, "offset": 0, "page": 1, "pages": 1 }
Но я получил исключение IllegalStateException, как в названии. Вот мои файлы:
DTO
data class CharacterDTO( val docs: Listlt;CharacterDatagt;, val limit: Int, val offset: Int, val page: Int, val pages: Int, val total: Int ) data class CharacterData( val _id: String, val birth: String, val death: String, val gender: String, val hair: String, val height: String, val name: String, val race: String, val realm: String, val spouse: String, val wikiUrl: String ) fun CharacterData.toCharacter(): Character{ return Character( _id = _id, birth = birth, death = death, gender = gender, name = name, race = race ) }
И это сбой в этом файле: ИСПОЛЬЗОВАНИЕ
lass GetCharactersUseCase @Inject constructor( private val repository: LotrRepository ) { operator fun invoke(): Flowlt;Listlt;Charactergt;gt; = flow { try { val characters = repository.getCharacters() // on this line it crash Log.d(Tag,characters.toString()) }catch (e: HttpException){ Log.d(Tag,e.toString()) }catch (e: IOException){ Log.d(Tag,e.toString()) } } }
И это хранилище
interface LotrRepository { suspend fun getBooks(): Listlt;BookDTOgt; suspend fun getCharacters(): Listlt;CharacterDTOgt; suspend fun getCharacterById(characterId: String): CharacterDTO }
И последнее, это моя просьба:
@Provides @Singleton fun provideLotrApi(): LotrApi{ val request = Retrofit.Builder() .client(OkHttpClient.Builder().addInterceptor { chain -gt; val request = chain.request().newBuilder().addHeader("Authorization", "Bearer ${Constants.API_KEY}").build() chain.proceed(request) }.build()) .baseUrl(Constants.BASE_URL) .addConverterFactory(GsonConverterFactory.create()) .build() .create(LotrApi::class.java) return request }
После моих исследований я забыл разобраться с этой частью
"total": 3, "limit": 1000, "offset": 0, "page": 1, "pages": 1
Но после изменений в моем файле DTO он все равно не работает
Ответ №1:
Приведенный выше JSON содержит только один CharacterDTO
объект, но вы ожидали получить список таких объектов. Либо измените серверную часть, чтобы вернуть список, либо замените getCharacters()
объявление на:
suspend fun getCharacters(): CharacterDTO
Комментарии:
1. какую часть я должен изменить, чтобы получить более 1 объекта?
2. Я не знаю вашего бэкенда и его API. Я могу только догадываться, неправильно ли вы запросили неверную конечную точку сервера, конечная точка была реализована неправильно или, возможно, здесь происходит что-то еще. Все, что я знаю, это то, что JSON, опубликованный выше, содержит только один символ.