是否可以使用 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 错误不正确。