Получение сообщения об ошибке с помощью retrofit HttpException

#android #android-studio #kotlin #retrofit2

#Android #android-studio #kotlin #модернизация 2

Вопрос:

Я использую Retrofit для отправки некоторых запросов к API, и когда я получаю ответ, он обычно поступает от API в этом формате, если запрос выполнен успешно

Успешный ответ

 {
    "success": 1,
    "error": [],
    "data": [
        // Some data..
     ]
}
 

И если есть ошибка, ответ будет выглядеть следующим образом

Неудачный ответ

 {
    "success": 0,
    "error": [
        "Password is incorrect"
    ],
    "data": []
}
 

Проблема теперь в том, что в случае неудачного запроса он приходит error code 403 , поэтому Retrofit классифицирует его как исключение и выдает HttpException , тогда у меня нет способа перехватить password is incorrect сообщение, прикрепленное к json ответу.

Есть ли какой-либо способ, которым я все еще могу получить ответ тела, даже если есть HttpException?

Обновить

Это пример кода, который я использую

ViewModel

 viewModelScope.launch {
    try {
        val result = myApi.request(requestParam)
    }catch (e: HttpException){
        // Log the error
    }
}
 

Ответ №1:

Что ж, я нашел способ вернуть ответ от переданного исключения.

Как я уже сказал в вопросе, это код, который я использую

Старый пример кода

 viewModelScope.launch {
    try {
        val result = myApi.request(requestParam)
    }catch (e: HttpException){
        // Log the error
    }
}
 

Однако я не знал, что тело ответа передается с исключением, и вы можете получить его в виде строки errorBody() , используя следующий метод.

Новый пример кода

 viewModelScope.launch {
    try {
        val result = myApi.request(requestParam)
    }catch (e: HttpException){
        val response = e.response()?.errorBody()?.string()
    }
}
 

И оттуда вы можете манипулировать этой строкой, чтобы извлечь сообщение об ошибке.