【发布时间】:2021-09-10 11:04:56
【问题描述】:
我想要实现的是我有一个NetworkManager 来处理服务器的request,并通过AFError 处理错误。
但是有时当服务器响应为 4xx 时,会有一条带有该响应的自定义消息,我想向用户显示该响应但不知道如何实现它。
这是我的NetworkManager
static let shared:NetworkManager = {
return NetworkManager()
}()
typealias completionHandler = ((Result<Data, AFError>) ->Void)
func handleAFrequest(request: DataRequest,completion: @escaping completionHandler) {
request.validate(statusCode: 200..<300)
request.responseJSON { (response) in
switch response.result {
case .success(_):
if let data = response.data {
completion(.success(data))
}
case .failure(let error):
print(error.localizedDescription)
switch error {
case .invalidURL(let url):
print("Invalid URL: \(url) - \(error.localizedDescription)")
completion(.failure(.invalidURL(url: URL)))
case .responseValidationFailed(let reason):
print("Response validation failed: \(error.localizedDescription); Reason:\(reason)")
completion(.failure(.responseValidationFailed(reason: reason)))
除了错误之外,我还希望能够转换服务器响应,并向用户显示响应的Message。
StatusCode 为 4xx 时的服务器响应示例:
{
"data":
"code":401;
"Message":"Phone Invalid"
}
【问题讨论】:
-
消息中的状态码是“401”,但您的请求是这样吗?您可以检索请求的数据并在失败/成功的情况下对其进行解析。然后您可以将错误/消息嵌入到 AFError 中。查看github.com/Alamofire/Alamofire/blob/master/Source/AFError.swift 哪个更好。
-
@Larme 如何将错误和消息嵌入到 AFError 中?例如
completion(.failure(.responseValidationFailed(reason:reason),serverMessage:JSON["data","Message"].string)) -
创建自己的错误:
enum CustomError: Error { case withJSONReason(Dictionary)},然后是let reason = ResponseValidationFailureReason. customValidationFailed(CustomError.withJSONReason(yourDict)) .failure(.responseValidationFailed(reason: reason)?或者类似的东西...... -
@Larme。非常感谢,但我如何访问
reason内的message以将其打印或投射到 UI。 -
case .responseValidationFailed(let reason): switch reason { case .customValidationFailed(let subError}: if let customError = subError as? CustomError { switch customError: case .withJSONReason(let dict): { print(dict} } ;default: break }这就是完整的逻辑,当然你可以分解它。
标签: swift alamofire swift5 alamofire5