#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.Логин пользователя(имя пользователя, пароль) } хотя я не уверен, каким должен быть тип функции, поскольку я получаю два разных ответа, могу ли я добавить успех и ошибку в один и тот же класс данных?