Модификация - Как я могу игнорировать поле, если его тип данных отличается? - PullRequest
0 голосов
/ 12 июня 2018

Я использую 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 с правильной ошибкойсообщение

1 Ответ

0 голосов
/ 12 июня 2018

В этом случае вам придется вручную анализировать ответ. Как и предположил Адил, примите «data» как JsonElement .

Когда вы получаете {status: "error"} т.е. исключительный случай, вы можете показать сообщение об ошибке, в противном случае в случае {status: "ok"} вы можете получить JsonArray из 'data' и использовать этот массив.

...