本着了解框架的实现思路和学习Swift的目的开启本系列的博客.本系列参考Alamofire官方文档和自己的一些理解,欢迎指正和指教.
配置要求
- iOS 8.0+, macOS 10.10.0+, tvOS 9.0+ and watchOS 2.0+
- Xcode 8.1+
- Swift 3.0+
简单使用
Alamofire.request("https://httpbin.org/get").responseJSON { response in
print("Request: \(String(describing: response.request))") // // 原始的请求
print("Response: \(String(describing: response.response))") // http 请求响应
print("Result: \(response.result)") // 响应结果标识
if let json = response.result.value {
print("JSON: \(json)") // JSON序列化的数据
}
if let data = response.data, let utf8Text = String(data: data, encoding: .utf8) {
print("Data: \(utf8Text)") // 经过UTF-8编码的数据
}
}
不难看出alamofire用了链式编程的思想.
响应数据类型
请求返回五种response
// Response Handler -直接返回URL session delegate的数据
func response(
queue: DispatchQueue?,
completionHandler: @escaping (DefaultDataResponse) -> Void)
-> Self
// Response Data Handler - 序列化为Data
func responseData(
queue: DispatchQueue?,
completionHandler: @escaping (DataResponse<Data>) -> Void)
-> Self
// Response String Handler - 序列化成String字符串
func responseString(
queue: DispatchQueue?,
encoding: String.Encoding?,
completionHandler: @escaping (DataResponse<String>) -> Void)
-> Self
// Response JSON Handler - 序列化成JSON
func responseJSON(
queue: DispatchQueue?,
completionHandler: @escaping (DataResponse<Any>) -> Void)
-> Self
// Response PropertyList (plist) Handler - 序列化成plist
func responsePropertyList(
queue: DispatchQueue?,
completionHandler: @escaping (DataResponse<Any>) -> Void))
-> Self
被序列化的数据可以用通过resonse中的result.value来获取数据
//也可以同时使用,内部通过线程队列实现
Alamofire.request("https://httpbin.org/get")
.responseString { response in
print("Response String: \(response.result.value)")
}
.responseJSON { response in
print("Response JSON: \(response.result.value)")
}
Response是默认在主线程队列执行异步回调,
(queue ?? DispatchQueue.main).async
这里的队列也是可以自定义的, 例如:
let utilityQueue = DispatchQueue.global(qos: .utility)
Alamofire.request("https://httpbin.org/get").responseJSON(queue: utilityQueue) { response in
print("Executing response handler on utility queue")
}
响应验证
validate可以在结果返回之前验证响应状态或类型是否正确,也可以使用默认方式验证.validate()
Alamofire.request("https://httpbin.org/get")
.validate(statusCode: 200..<300)
.validate(contentType: ["application/json"])
.responseData { response in
switch response.result {
case .success:
print("Validation Successful")
case .failure(let error):
print(error)
}
}
Response缓存
Response缓存基于系统的URLCache,如果需要自定义参数在后面 Session Manager Configurations章节中会讲到
系列目录
- Alamofire4.x开源代码分析(一)使用方法
- Alamofire4.x开源代码分析(二)请求参数和编码
- Alamofire4.x开源代码分析(三)下载数据(更新中)