是否可以使用 RxSwift 和 Moya 映射到 "fallback" Decodable?
Is it possible to map to a "fallback" Decodable using RxSwift and Moya?
我在我的应用程序的网络层使用 RxMoya,我遇到这样一种情况,即服务器可以发送预期的响应(比如 User
),或者一个错误对象,两者都具有状态码200,例如:
{
"name": "john doe",
"username": "john_doe"
}
可能是预期的响应并且
{
"error": {
"code": 100,
"message": "something went wrong™"
}
}
可能是错误。
网络适配器的相关部分可能如下所示:
return provider
.rx
.request(MultiTarget.target(target))
.map(User.self)
// if above fails, try:
// .map(UserError.self)
.asObservable()
有没有办法先尝试 .map(User.self)
,如果失败,再尝试 .map(UserError.self)
在同一个操作链中?换句话说,我可以使用 Rx 提供替代映射模型吗?
您可以使用 flatMap
来做到这一点。像这样:
return provider
.rx
.request(MultiTarget.target(target))
.flatMap { response -> Single<User> in
if let responseType = try? response.map(User.self) {
return Single.just(responseType)
} else if let errorType = try? response.map(UserError.self) {
return Single.error(errorType.error)
} else {
fatalError("⛔️ We don't know how to parse that!")
}
}
顺便说一句,状态码 200 到 return 错误不正确。
我在我的应用程序的网络层使用 RxMoya,我遇到这样一种情况,即服务器可以发送预期的响应(比如 User
),或者一个错误对象,两者都具有状态码200,例如:
{
"name": "john doe",
"username": "john_doe"
}
可能是预期的响应并且
{
"error": {
"code": 100,
"message": "something went wrong™"
}
}
可能是错误。
网络适配器的相关部分可能如下所示:
return provider
.rx
.request(MultiTarget.target(target))
.map(User.self)
// if above fails, try:
// .map(UserError.self)
.asObservable()
有没有办法先尝试 .map(User.self)
,如果失败,再尝试 .map(UserError.self)
在同一个操作链中?换句话说,我可以使用 Rx 提供替代映射模型吗?
您可以使用 flatMap
来做到这一点。像这样:
return provider
.rx
.request(MultiTarget.target(target))
.flatMap { response -> Single<User> in
if let responseType = try? response.map(User.self) {
return Single.just(responseType)
} else if let errorType = try? response.map(UserError.self) {
return Single.error(errorType.error)
} else {
fatalError("⛔️ We don't know how to parse that!")
}
}
顺便说一句,状态码 200 到 return 错误不正确。