api请求失败时如何在swift alamofire中使用responsedecodable解析错误

Posted

技术标签:

【中文标题】api请求失败时如何在swift alamofire中使用responsedecodable解析错误【英文标题】:How to parse error when api request fails using responsedecodable in swift alamofire 【发布时间】:2020-07-06 15:52:58 【问题描述】:

我正在尝试使用 alamofire 和 responseDecodable 向后端发出 API 请求。

AF.request(Router.registerFacebookUser(facebookToken: token)).validate().responseDecodable(of: UserConfig.self)  result in
        switch result.result 
        case let .success(userConfig):
            onAuthentication(userConfig)
        case let .failure(error):
            print(error)
            //somehow get the message from ERROR JSON and pass it here
            onFailure(error.localizedDescription)
        
    

当调用成功时,它成功地将 JSON 解析到模型中。但是,作为一些特殊情况,它应该失败。例如,如果用户已经注册,我会收到响应 JSON:


   "error":
      "message":"User already exist"
   

是否可以覆盖我们收到的 AF 错误?或者如果请求失败,也许可以解析另一个对象?还是有其他方法可以访问错误消息?

【问题讨论】:

当它“失败”时,你会得到一个不同的 JSON 类型的 200,还是你有不同的 HTTP 代码?那么这取决于您是否需要处理成功或失败的案例。 @Larme 失败时,我得到 400 和 JSON 错误。当它成功时 200 和 JSON for UserConfig 您可以使用自定义validate() ***.com/questions/45955823/…(在以前的版本中,但在较新的版本中应该仍然可用)。然后你决定做什么:如果解析的错误不为零,则调用成功,如果不是,则不失败?此外,您应该能够从AFError 检索数据。或者只是访问result.data AFError 将不包含响应 Data。您可以创建自己的错误以包含已解析的错误响应。 @JonShier 是的,这就是我需要的,也许您有更多信息如何做到这一点? 【参考方案1】:

在 Alamofire 中有几种方法可以解决这个问题。

    在采用闭包的 validate() 方法中,解析错误正文并生成带有自定义关联错误的 .failure 结果:
.validate  request, response, data
    // Check request or response state, parse data into a custom Error type.
    return .failure(MyCustomErrorType.case(parsedError))

然后,在您的响应处理程序中,您需要从AFErrorunderlyingError 属性转换为您的自定义错误类型:

.responseDecodable(of: SomeType.self)  response in
    switch response.result 
    case let .success(value): // Do something.
    case let .failure(error):
        let customError = error.underlyingError as? MyCustomErrorType
        // Do something with the error, like extracting the associated value.

    使用Decodable 容器类型将您的响应解析为您期望的类型或错误表示。您应该可以在其他地方找到示例,但在 Alamofire 方面,它会像这样工作:
.responseDecodable(of: ContainerType<SomeType>.self)  response in
    // Do something with response.

    编写自定义的ResponseSerializer 类型,用于检查响应并在检测到故障时解析错误类型,否则解析预期类型。我们在our documentation 中有示例。

在这些选项中,我通常使用包装器类型,除非我已经在使用我自己的自定义 Error 类型,在这种情况下验证器相当简单。自定义序列化程序工作量最大,但也为您提供最大的灵活性,尤其是在您需要自定义响应处理的其他方面时。

【讨论】:

以上是关于api请求失败时如何在swift alamofire中使用responsedecodable解析错误的主要内容,如果未能解决你的问题,请参考以下文章

在 swift 中使用 Alamofire 的 Json 请求失败

在 swift 中使用 Alamofire 取消 api 请求

请求失败时从 AlamoFire 获取 JSON 响应

使用 django API 和 Alamofire 请求失败

iOS Swift 2 - 失败时的 Alamofire 打印响应值

iOS/IBM Cloud/Swift:使用 AlamoFire 发布到 Watson API