如何使用swift alamofire中的responsedecodable解析api请求失败时的错误
我正在尝试使用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):
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是的,这就是我需要的,也许你有更多的信息怎么做?