前言
在软件开发过程中,和服务端的数据通信是必不可少的步骤。而如果要封装一个比较全面的网络库又是耗时耗力的工作。为了快速开发迭代,这时候我们通常会寻找开源的三方库,而在 Swift 语言中,Alamofire 是最流行的网络库,在Github上已经收获了33.2K颗星了。为了更好的使用这个库,今天我们就来看一下这个库的内部实现。
简单调用
使用 Alamofire 非常简单,通过一句简单的代码调用就可以实现一个请求
Alamofire.request("https://example.com/test").responseJSON { (response) in
print(response)
}
内部实现逻辑其实和 AFNetworking 这个库基本一致。但是由于语言特性,很多写法和 OC 语言的写法有很大的不同。
在对请求参数做 encode 的时候,Alamofire 通过 Protocol + Struct 的方式来实现的
public protocol ParameterEncoding
public struct URLEncoding: ParameterEncoding
public struct JSONEncoding: ParameterEncoding
public struct PropertyListEncoding: ParameterEncoding
这样就实现了在调用方无感的情况下根据设置的 encode 方式来做不同的处理,代码之间的耦合也比较松散。
为了更好的处理请求,Alamofire 还提供了 RequestAdapter 和 RequestRetrier 两个协议,RequestAdapter 主要用于在请求发起前对 URLRequest 做一次编辑,例如加参数,修改 header,甚至是地址重定向。RequestRetrier 主要用于在请求出现错误的时候决定是否需要重新发送请求。只要实现这两个协议就可以非常方便的实现这两个功能。
public struct NetworkAdapter: RequestAdapter {
public func adapt(_ urlRequest: URLRequest) throws -> URLRequest {
return urlRequest
}
}
public struct NetworkRetry: RequestRetrier {
public func should(_ manager: SessionManager, retry request: Request, with error: Error, completion: @escaping RequestRetryCompletion) {
completion(true, 1)
}
}
// 对 SessionManager 实例的属性赋值就可以实现这两个功能
self.requestManager = SessionManager(configuration: configuration)
self.requestManager.adapter = NetworkAdapter()
self.requestManager.retrier = NetworkRetry()
通过对 DataRequest ( request 方法返回的对象类型)进行扩展,可以使用链式语法很方便的在 request 方法后面直接调用 response 方法,这样的调用方式比 AFNetworking 那种把 responseBlock 作为参数传递要简明很多。由于通过单独方法调用的方式实现了 response 的“可选性”,所以当我使用单独调用的方式来实现response的逻辑,会不会出现请求结束了,但是没有拿到请求结果的情况呢?
最后
以上就是本篇的全部内容,由于对于下载、证书验证等功能模块并没有做比较深入的了解,所以本篇只对普通的http网络请求做一个简单的了解。势必会有一些遗漏和错误的地方,欢迎斧正~
网友评论