Я использую Retrofit 2.4.0 с GsonConverterFactory и RxJavaFactory.
Предположим, я сейчас вызываю API с именем getSomething
.
В нормальных ситуациях сервер возвращает
{
status: "ok",
errorMsg: "",
data: {...}
}
Но если возникает ошибка:
{
status: "error",
errorMsg: "Some error message",
data: []
}
Обратите внимание, что данные становятся массивом, если возникает ошибка.
Вот как я определяю API:
@GET("URL")
fun getSomething(): Observable<SomeResponse<SomeObject>>
SomeResponse:
open class SomeResponse<T> {
var data: T? = null
@SerializedName("errorMsg")
var errorMessage: String? = ""
var status: String? = ""
}
И в APIManager
(Singleton):
fun getSomething(): Observable<SomeObject> {
return someAPI.getSomething()
.map{ response ->
if (response.status != "ok") throw new APIException(response.errorMessage)
response.data
}
.subscribeOn(Schedulers.io())
.unsubscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
}
Как вы можете видеть, если статус не "ok"
, APIException
который я определил сам, будет выдан с сообщением об ошибке, возвращенным с сервера, чтобы я мог иметь свою собственную обработку (например, отобразить диалог с этим сообщением об ошибке).
Но теперь он даже не может достичь этого броска.
Поскольку data
теперь является массивом, вместо него выбрасывается JsonSyntaxException
, и поэтому я не могу показать правильное сообщение об ошибке пользователю.
Что я хочу сделать
Я знаю, что могу задержать разбор data
после проверки статуса, сделав все декларации Retrofit interface to return Observable<SomeResponse<Any>>
и выполните:
.map{ response ->
if (response.status != "ok") throw new APIException(response.errorMessage)
response.data
}
.map{ data ->
//Parse the object here
}
Предположим, я не хочу этого делать, все еще полагаясь на GsonConverterFactory для выполнения синтаксического анализа, есть ли способ выбросить APIException
с правильной ошибкойсообщение