這兩個協議抽象了URL與URLRequest,使得建立請求時再也不侷限於必須使用這兩個對象來初始化,可使用任意符合兩個協議的對象便可,方便上層封裝解耦。github
協議很簡單,只有一個方法,遵循該協議的對象只須要實現一個方法,生成一個URL便可。而且該方法能夠拋出異常,拋出異常時,Alamofire會中止請求並返回AFError.invalidURL的錯誤。swift
public protocol URLConvertible {
func asURL() throws -> URL
}
複製代碼
URL(string: self)
,爲空時拋出錯誤self.url
,爲空時拋出錯誤若須要自定義建立url的規則(host,統一路徑,基於不一樣接口的不一樣路徑等需求)能夠本身實現類/結構體,而後遵循該協議,返回自定義拼接的url便可api
該協議相似URLConvertible,也是隻有一個方法,不過生成的是URLRequest對象。也能夠拋出錯誤。markdown
public protocol URLRequestConvertible {
func asURLRequest() throws -> URLRequest
}
//另外擴展了一下協議,添加了一個計算屬性,能夠快速獲取URLRequest,返回的是個可選值,若是拋出錯誤,會忽略錯誤並返回nil:
extension URLRequestConvertible {
public var urlRequest: URLRequest? { try? asURLRequest() }
}
複製代碼
只有URLRequest對象實現了該協議,返回自身:ide
extension URLRequest: URLRequestConvertible {
public func asURLRequest() throws -> URLRequest { self }
}
複製代碼
相似於URLConvertible,須要本身建立URLRequest對象的話,oop
使用三個自定義類型來建立URLRequest,也能方便管理與擴展,所以擴展了URLRequest對象,添加了使用這三個類型來初始化的方法,方法容許拋出錯誤,拋出錯誤時返回建立請求失敗的錯誤。post
extension URLRequest {
public init(url: URLConvertible, method: HTTPMethod, headers: HTTPHeaders? = nil) throws {
let url = try url.asURL()
self.init(url: url)
httpMethod = method.rawValue
allHTTPHeaderFields = headers?.dictionary
}
}
複製代碼
這兩個協議,通常是須要對Alamofire進行二次封裝(符合本身的業務邏輯需求)時會用到,對一些通用數據進行封裝,以及一些須要針對業務需求進行變動的數據進行處理。推薦一個基於Alamofire進行二次封裝的很棒的庫:Moya,github上12k+的星星,對Alamofire進行了二次封裝,把請求頭,請求參數,請求類型等業務相關的部分抽象成Provider協議,方便實現管理各類本身的api。並且還支持Rx,很好玩~有興趣的能夠看看。學習