1

これに似ていますが、今回はサーバーの JSOn 応答を取得する必要があります。

ここに私の既存のコードがあります:

return Observable.create{ observer in
            let _ = self.provider
                .request(.getMerchantDetails(qrId: qrId))
                .filterSuccessfulStatusCodes()
                .mapJSON()
                .subscribe(onNext: { response in
                    observer.onNext(RQRMerchant(json: JSON(response)))
                }, onError: { error in
                    observer.onError(error)
                })
            return Disposables.create()

私の質問は: エラー応答コード 404error.localizedDescriptionを取得できますが、404 HTTP 要求の JSON 応答も取得したいと考えています。

4

2 に答える 2

0

サーバーの応答も JSON に含まれているため、出力はonNext成功した JSON 応答または無効な JSON 応答になる可能性があります。

do演算子を使用して応答の有効性を確認します

次のようにして、応答の有効性を確認できます。

return Observable.create{ observer in

        let _ = self.provider
            .request(.getMerchantDetails(qrId: qrId))
            .filterSuccessfulStatusCodes()
            .mapJSON()
            .do(onNext: { response in 
                 let isValidResponse : Bool = false // check if response is valid

                  if !isValidResponse {
                      throw CustomError.reason
                  }
            })
            .subscribe(onNext: { response in
                observer.onNext(RQRMerchant(json: JSON(response)))

            }, onError: { error in
                observer.onError(error)

            })

        return Disposables.create()
  1. do演算子を使用する
  2. onNext放出が実際に有効な放出であるかどうかを確認する
  3. 無効な場合はエラーをスローし、監視可能な操作が失敗したことを示します。

応答の検証

応答検証コードを適切な場所に保持するために、有効かどうかを検証するクラス関数を応答クラス定義内に定義できます。

class ResponseOfTypeA {
    public class func isValid(response: ResponseOfTypeA) throws {
        if errorConditionIsTrue {
            throw CustomError.reason
        }
    }
}

次のことができるようにします。

    // Your observable sequence
    .mapJSON()
    .do(onNext: ResponseOfTypeA.isValid)
    .subscribe(onNext: { response in 
        // the rest of your code

    })
于 2017-07-01T10:06:25.113 に答える