我正在使用Retrofit 2.4.0,使用GsonConverterFactory和RxJavaFactory。
假设我现在正在调用名为getSomething
的API。
在正常情况下,服务器返回
{
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
(单身人士)中:
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
,因此我无法向用户显示正确的错误消息。
我知道在检查状态后,通过将Retrofit接口的所有声明都返回data
,我可以延迟解析Observable<SomeResponse<Any>>
,并执行:
.map{ response ->
if (response.status != "ok") throw new APIException(response.errorMessage)
response.data
}
.map{ data ->
//Parse the object here
}
假设我不想这样做,依靠GsonConverterFactory进行解析,有没有办法抛出APIException
正确的错误信息?
答案 0 :(得分:0)
对于这种情况,您必须手动解析响应,正如Adeel建议的那样,采取数据&#39;为JsonElement。
当您获得{database
即例外情况时,您可以显示错误消息,否则如果是{status: "error"}
,您可以从数据&#39;中获取JsonArray。并使用该数组。
答案 1 :(得分:0)
作为替代,
如果您使用的是 Kotlin,则可以绕过此问题,将变量声明为“Any”。
@SerializedName("my_parameter")
@Expose
var myVar: Any ?= null