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
本身是一个闭包,在请求完成后调用该闭包对响应进行验证,如果符合验证的条件返回成功,不符合条件返回错误。
网友评论