我使用的是带有GsonConverterFactory和RxJavaFactory的改型2.4.0。
假设我现在调用一个名为getSomething
的API。
在正常情况下,服务器返回
{
status: "ok",
errorMsg: "",
data: {...}
}
但如果发生错误:
{
status: "error",
errorMsg: "Some error message",
data: []
}
请注意,如果发生错误,数据会变成数组。
下面是我对API的定义:
@GET("URL")
fun getSomething(): Observable<SomeResponse<SomeObject>>
一些响应:
open class SomeResponse<T> {
var data: T? = null
@SerializedName("errorMsg")
var errorMessage: String? = ""
var status: String? = ""
}
而在APIManager
(单例)中:
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())
}
正如您所看到的,如果status不是"ok"
,则会抛出我自己定义的APIException
,并从服务器返回错误消息,以便我可以进行自己的处理(例如,显示带有该错误消息的对话框)。
但现在它连那一抛都够不着。
由于data
现在是一个数组,因此会抛出一个JsonSyntaxException
,因此我无法向用户显示正确的错误消息。
我想做的事
我知道我可以在检查状态后延迟data
的解析,方法是使Retrofit接口的所有声明返回Observable<SomeResponse<Any>>
,并执行以下操作:
.map{ response ->
if (response.status != "ok") throw new APIException(response.errorMessage)
response.data
}
.map{ data ->
//Parse the object here
}
假设我不想这样做,仍然依赖于GsonConverterFactory来进行解析,有没有办法抛出APIException
并显示正确的错误消息?
2条答案
按热度按时间58wvjzkj1#
对于这种情况,您必须手动解析响应,正如Adeel建议的那样,将“data”作为JsonElement。
当你得到{
status: "error"}
,即异常情况,你可以显示错误消息,否则,在{status: "ok"}
的情况下,你可以从'data'获得JsonArray并使用该数组。nhhxz33t2#
作为一种替代方案,
如果您使用的是Kotlin,则可以绕过此问题,将变量声明为“Any”。