Обработка ответа на успех и ошибку, когда они имеют различную структуру друг от друга

#android #retrofit #kotlin-coroutines

Вопрос:

Я создаю приложение для Android, и ответ на успех и ошибку приходит в другой структуре (он возвращает разные объекты) для них обоих. Как вы справляетесь с этим, используя Kotlin, модернизацию и сопрограммы, поскольку я имел дело только с одними и теми же ответами на структуру, Как вы пишете забавный тип в вызове API и как вы обрабатываете разные ответы в методе viewModelScope и наблюдения. Ниже приведен пример моего ответа: Успешный ответ:

 {  "access_token": "xxxxxxxxxxx",  "token_type": "bearer" }  

Ответ на ошибку:

 {  "detail": [  {  "loc": [  "body"  ],  "msg": "Invalid credentials",  "type": "invalid-credentials"  }  ] }  

Ответ №1:

В вашем api у вас должен быть такой метод, и он возвращает ответ на изменение :

 @POST//or @GET or any http method you want suspend fun userLogin(//Parameters) : Responselt;LoginResponsegt;  

чтобы выполнить запрос, вы напишете что-то вроде этого :

 val response = RetrofitInstance.api.userLogin(username, password)//this will return a response //now we check if the response is successful or not if(response.isSuccessful){//a response is successful when the response code is 2XX  return response.body //respnse.body = LoginResponse }  //if the response failed that means the response code is different than 2XX //so the response body will be null and response.errorBody will contain the errorResponse you specified val gson = Gson() val type = object : TypeTokenlt;ErrorResponsegt;() {}.type //ErrorResponse is the data class that matches the error response val errorResponse = gson.fromJsonlt;ErrorResponsegt;(response.errorBody()!!.charStream(), type) // errorResponse is an instance of ErrorResponse that will contain details about the error  //either throw an exception or return null  throw Exception(errorResponse.error)   

Комментарии:

1. А как насчет ответа на успех?

2. можете ли вы показать код вашего запроса?

3. Поскольку я показал ответ входа в систему, я также показываю запрос входа в систему. Это класс данных LoginRequest: запрос класса данных ( имя пользователя val: Строка, пароль val: Строка )

4. @FrensisXh я хочу увидеть код запроса, в котором вы выполняете вызов api с помощью retrofit

5. Я надеюсь, что это то, что вы имеете в виду: приостановить забавный логин пользователя(имя пользователя: строка, пароль: строка): LoginResponse { вернуть RetrofitInstance.api.Логин пользователя(имя пользователя, пароль) } хотя я не уверен, каким должен быть тип функции, поскольку я получаю два разных ответа, могу ли я добавить успех и ошибку в один и тот же класс данных?