Swift学习记录总结

Alamofire请求失败时处理

2018-07-24  本文已影响6人  Light413
alamofire.png

Alamofire简单使用

Alamofire融合Swift本身的特点,使用起来更加简单方便。下面引用官方Demo,发起一个请求并json解析处理。

Alamofire.request("https://httpbin.org/get").responseJSON { response in
    print("Request: \(String(describing: response.request))")   // original url request
    print("Response: \(String(describing: response.response))") // http url response
    print("Result: \(response.result)")                         // response serialization result

    if let json = response.result.value {
        print("JSON: \(json)") // serialized json response
    }

    if let data = response.data, let utf8Text = String(data: data, encoding: .utf8) {
        print("Data: \(utf8Text)") // original server data as UTF8 string
    }
}

问题描述

以上Demo发起的请求在正常的情况貌似没什么问题,但前提必须是服务器正确响应了请求。一旦响应错误(比如500 ,404,403的错误)发生,就无法进入 responseJSON方法回调,所以你的Loading 会一直在转圈。程序就此进入假死状态。

一般我们只处理服务器返回200 成功的状态,其他的状态我们可直接判定为响应出现了错误。此时就需要在响应时进行验证 即这里所描述的 Validation,响应验证器。

添加验证器的请求

    Alamofire.request(url, method: method, parameters: parameters, encoding:encoding, headers: header)
        .validate()
        .responseJSON { (dataResponse) in
            DispatchQueue.main.async {
                switch dataResponse.result {
                case .success(let value):
                    if let dic = value as? [String:Any] ,let status = dic["state"] {
                        if "\(status)" == "200" {
                            if let success = successHandler {
                                success(dic);
                            }
                        }else{
                            //print(dic)
                            if let failure = failureHandler {
                                failure(dic["msg"] as? String)
                            } else {
                                HUD.show(info: "\(dic["msg"])");
                            }
                        }
                    }
                    break
                    
                case .failure(let error):
                    print(dataResponse.response?.statusCode);
                    break
                }
            }
    }
    

添加validate()默认验证 状态码在 (200..<300) 和 acceptableContentTypes,验证通过直接执行

case .success(let value):

否则执行

case .failure(let error):

这样即使出现上述中错误,我们也可以在failure回调中处理。

验证器Validation

Validation本身是一个闭包,在请求完成后调用该闭包对响应进行验证,如果符合验证的条件返回成功,不符合条件返回错误。

上一篇下一篇

猜你喜欢

热点阅读