Retrofit. POST. Android. Kotlin
Существует запрос POST на сервер с помощью библиотеки Retrofit. Если запрос выполнен успешно, то возвращается некий объект с данными. НО если какая-то ошибка, например, неверный код был передан, то ответ будет в виде НЕ объекта (это и так понятно), а в виде строки. К примеру, "wrong_code".
Как можно получить текст ошибки (я имею ввиду строку "wrong_code", к примеру)?
Любая ошибка отправляется в блок кода, где эти ошибки обрабатываются, необходимо их как-то определить, что можете посоветовать в этой ситуации?
Запрос выполняется с помощью библиотеки JavaRX
fun doAuth(key: String, id: String, authRequest: AuthRequest) {
postAPI.setAuth(key, id, authRequest)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({
view.onSuccessful()
}, {
view.onFailure(it.message!!)
})
}
Ответы (1 шт):
Ошибка от сервера приходит как обычный Json, вы можете распарсить ее в свой кастомный объект ошибки и работать с ним так как вам это необходимо.
Вот небольшой пример:
private fun parseResponse(response: Response<RESPONSE>): RESPONSE {
val data: RESPONSE?
if (response.isSuccessful)
data = response.body()
else
throw getNetworkException(response)
}
Где RESPONSE это дженерик тайп. Вы можете так и оставить, либо же заменить его конкретным типом. Здесь я написал свой кастомный NetworkProvider который отлавливает результат от каждого запроса и парсит его в нужный мне ответ.
private fun getNetworkException(response: Response<RESPONSE>): NetworkException {
val type = object : TypeToken<NetworkException>() {}.type
return Gson().fromJson(response.errorBody()!!.charStream(), type)
}
Здесь как раз и происходит парсинг ответа с ошибкой. Ниже собственно мой кастомный объект ошибки:
data class NetworkException(
@SerializedName("status_code") val statusCode: Int = 0,
@SerializedName("status_message") val statusMessage: String = "",
@SerializedName("success") val isSuccessful: Boolean = false
) : Exception()
В вашем случае это может быть объект вроде такого:
data class NetworkException(
@SerializedName("status_message") val statusMessage: String = ""
) : Exception()