【发布时间】:2017-06-22 12:46:49
【问题描述】:
目前,我使用retrofit2 调用restful api并获得响应。因为响应体可以是多种类型,所以我写了如下代码。
//Interface
@FormUrlEncoded
@POST("payments/events/{id}")
fun postPayment(@Path("id") id: String): Call<Any>
//Api Manager
fun postPayment(id: String): Observable<Any> {
return Observable.create {
subscriber ->
val callResponse = api.postPayment(id)
val response = callResponse.execute()
if (response.isSuccessful) {
if (response.body() is MyClass1) {
// never success...
} else if (response.body() is MyClass2) {
// never success...
}
subscriber.onNext(response.body())
subscriber.onCompleted()
} else {
subscriber.onError(Throwable(response.message()))
}
}
}
所以我无法将response.body() 转换为MyClass1 或MyClass2。
response.body() as MyClass1 也出现错误。
MyClass1 和 MyClass2 是普通的模板类。
class MyClass1( val id: String, val data: String)
有什么聪明的方法可以将响应主体转换为我的自定义类吗?
MyClass2 的小更新
class MyClass2( val token: String, val url: String, val quantity: Int)
【问题讨论】:
-
为什么不使用自定义对象来接收响应?类似
Call<MyResponse> -
正如我所描述的,在我的例子中,响应类型可以是多种类型 - MyClass1 或 MyClass2。
-
(
MyClass1和MyClass2)有什么不同吗? -
很遗憾,是的。
-
Retrofit 对
MyClass1和MyClass2一无所知,您可能想编写一个自定义 responseBodyConverter。