美文网首页Swift学习记录总结
Alamofire请求失败时处理

Alamofire请求失败时处理

作者: Light413 | 来源:发表于2018-07-24 15:58 被阅读6次
    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本身是一个闭包,在请求完成后调用该闭包对响应进行验证,如果符合验证的条件返回成功,不符合条件返回错误。

    相关文章

      网友评论

        本文标题:Alamofire请求失败时处理

        本文链接:https://www.haomeiwen.com/subject/jgqymftx.html