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

如何使用swift alamofire中的responsedecodable解析api请求失败时的错误,swift,alamofire,Swift,Alamofire,我正在尝试使用alamofire和responseDecodable对后端执行API请求 AF.request(Router.registerFacebookUser(facebookToken: token)).validate().responseDecodable(of: UserConfig.self) { result in switch result.result { case let .success(userConfig):

我正在尝试使用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错误?或者,如果请求失败,可能解析另一个对象?或者还有其他方法可以访问错误消息吗?

在Alamofire中有几种方法可以实现这一点

  • 在接受闭包的
    validate()
    方法中,解析错误主体并生成带有自定义关联错误的
    .failure
    结果:
  • .validate{请求、响应、数据
    //检查请求或响应状态,将数据解析为自定义错误类型。
    return.failure(MyCustomErrorType.case(parsedError))
    }
    
    然后,在响应处理程序中,需要从
    AFError
    underlineerror
    属性转换为自定义错误类型:

    .responseDecodable(属于:SomeType.self){response in
    开关响应。结果{
    case let.success(value)://做点什么。
    案例失败(错误):
    将customError=error.underyingError设置为?MyCustomErrorType
    //对错误执行一些操作,例如提取关联的值。
    }
    
  • 使用
    Decodable
    容器类型将您的响应解析为您期望的类型或您的错误表示。您应该能够在其他地方找到示例,但在Alamofire方面,它的工作原理如下:
  • .responseDecodable(of:ContainerType.self){response in
    //做些有反应的事情。
    }
    
  • 编写一个自定义
    ResponseSerializer
    类型,当检测到故障时检查响应并解析错误类型,否则解析预期类型。中有示例

  • 在这些选项中,我通常使用包装器类型,除非我已经在使用自己的自定义
    错误
    类型,在这种情况下,验证器相当容易。自定义序列化器是最有用的,但也给了您最大的灵活性,特别是当您需要自定义响应处理的其他方面时。

    有几种方法在阿拉莫菲尔接近这一点

  • 在接受闭包的
    validate()
    方法中,解析错误主体并生成带有自定义关联错误的
    .failure
    结果:
  • .validate{请求、响应、数据
    //检查请求或响应状态,将数据解析为自定义错误类型。
    return.failure(MyCustomErrorType.case(parsedError))
    }
    
    然后,在响应处理程序中,需要从
    AFError
    underlineerror
    属性转换为自定义错误类型:

    .responseDecodable(属于:SomeType.self){response in
    开关响应。结果{
    case let.success(value)://做点什么。
    案例失败(错误):
    将customError=error.underyingError设置为?MyCustomErrorType
    //对错误执行一些操作,例如提取关联的值。
    }
    
  • 使用
    Decodable
    容器类型将您的响应解析为您期望的类型或您的错误表示。您应该能够在其他地方找到示例,但在Alamofire方面,它的工作原理如下:
  • .responseDecodable(of:ContainerType.self){response in
    //做些有反应的事情。
    }
    
  • 编写一个自定义
    ResponseSerializer
    类型,当检测到故障时检查响应并解析错误类型,否则解析预期类型。中有示例

  • 在这些选项中,我通常使用包装器类型,除非我已经在使用我自己的自定义
    Error
    类型,在这种情况下,验证器相当容易。自定义序列化程序是最有用的,但也给了您最大的灵活性,特别是当您需要自定义响应处理的其他方面时。

    当它“失败”时,您是使用不同JSON类型的200,还是使用不同的HTTP代码?这取决于您是否需要处理成功或失败案例。@Larme当它失败时,我会使用400和JSON作为错误。当它成功使用200和JSON作为UserConfig时,您可以使用自定义
    validate()
    (在以前的版本中,但仍应在较新的版本中提供)。然后决定要做什么:如果错误解析为非零,则调用success;如果错误解析为非零,则调用failure。此外,您应该能够从
    AFError
    检索数据。或者只访问
    结果。数据
    AFError
    将不包含响应
    数据
    。您可以创建自己的错误来包含解析的错误响应onse。@JonShier是的,这就是我需要的,也许你有更多的信息如何做?当它“失败”时,您是使用不同JSON类型的200,还是使用不同的HTTP代码?这取决于您是否需要处理成功或失败案例。@Larme当它失败时,我会使用400和JSON作为错误。当它成功使用200和JSON作为UserConfig时,您可以使用自定义
    validate()
    (在以前的版本中,但仍应在较新的版本中提供)。然后决定要做什么:如果错误解析为非零,则调用success;如果错误解析为非零,则调用failure。此外,您应该能够从
    AFError
    检索数据。或者只访问
    结果。数据
    AFError
    将不包含响应
    数据
    。您可以创建自己的错误来包含解析的错误响应onse.@JonShier是的,这就是我需要的,也许你有更多的信息怎么做?