Alamofire介绍
Alamofire是一个使用Swift开发的网络请求库,其开发团队是AFNetworking的原团队,Swift发布后,AFNetworking的作者又用Swift语言写了个相同功能的库,这便是Alamofire。如果说AFNetworking是OC上最受欢迎的网络库,那Alamofire无疑就是Swift中最受欢迎的网络库。Alamofire取名于一种花的名字,AFNetworking的前缀AF便也是Alamo fire的缩写。本文主要是针对Alamofire5.0的介绍
Alamofire使用
.GET/POST请求:
如果不指定请求方式,则默认为GET请求。
Alamofire提供的请求接口
open func request(_ convertible: URLConvertible,
method: HTTPMethod = .get,
parameters: Parameters? = nil,
encoding: ParameterEncoding = URLEncoding.default,
headers: HTTPHeaders? = nil,
interceptor: RequestInterceptor? = nil,
requestModifier: RequestModifier? = nil) -> DataRequest {
let convertible = RequestConvertible(url: convertible,
method: method,
parameters: parameters,
encoding: encoding,
headers: headers,
requestModifier: requestModifier)
return request(convertible, interceptor: interceptor)
}
open func request(_ convertible: URLConvertible,
method: HTTPMethod = .get,
parameters: Parameters? = nil,
encoder: ParameterEncoder = URLEncodedFormParameterEncoder.default,
headers: HTTPHeaders? = nil,
interceptor: RequestInterceptor? = nil,
requestModifier: RequestModifier? = nil) -> DataRequest {
let convertible = RequestEncodableConvertible(url: convertible,
method: method,
parameters: parameters,
encoder: encoder,
headers: headers,
requestModifier: requestModifier)
return request(convertible, interceptor: interceptor)
}
注意:以上两个api接口不同之处就是encoding: ParameterEncoding与encoder: ParameterEncoder。
encoding参数是针对入参是字典的请求参数编码方式,默认方式是URLEncoding.default。
ParameterEncoding协议实现了两个结构体:
URLEncoding
JSONEncoding
encoder参数是针对入参是遵守Codable协议的请求参数编码方式,默认方式是URLEncodedFormParameterEncoder.default。
ParameterEncoder协议下也实现了两个结构体:
JSONParameterEncoder
URLEncodedFormParameterEncoder
对于使用HTTP请求体(HTTP body)的网络请求,如果HTTP头(HTTP header)中的 Content-Type 没有被设置过,那么就会被设置成 以下默认值
JSONParameterEncoder 对应的 Content-Type 为 application/json
URLEncodedFormParameterEncoder 对应的 Content-Type 为 application/x-www-form-urlencoded; charset=utf-8
下面这个接口就是直接请求组装好的 URLRequest,其实上面两个接口调用的就是这个,这里我就随便截两个图看一下好了。
open func request(_ convertible: URLRequestConvertible, interceptor: RequestInterceptor? = nil) -> DataRequest {
let request = DataRequest(convertible: convertible,
underlyingQueue: rootQueue,
serializationQueue: serializationQueue,
eventMonitor: eventMonitor,
interceptor: interceptor,
delegate: self)
perform(request)
return request
}
HTTP Headers 请求头设置
/// 1. 无参构造
public init() {}
/// 通过以下方式添加值
func add(name: String, value: String)
func add(_ header: HTTPHeader)
eg:
var headers: HTTPHeaders
headers.add(name: "Accept", value: "application/json")
/// 2. 通过 HTTPHeader 数组构造
public init(_ headers: [HTTPHeader])
eg:
let headers: HTTPHeaders = [
HTTPHeader(name: "Authorization", value: "Basic VXNlcm5hbWU6UGFzc3dvcmQ="),
HTTPHeader(name: "Accept", value: "application/json")
]
/// 3. 通过key/value 构造
public init(_ dictionary: [String: String])
eg:
let headers: HTTPHeaders = [
"Authorization": "Basic VXNlcm5hbWU6UGFzc3dvcmQ=",
"Accept": "application/json"
]
响应处理
Alamofire 中包涵了6种不同的默认的数据响应处理程序,如图:
这里看到responseJSON已经被弃用了,将会在6.0种彻底的移除这个接口,使用responseDecodable替代。
这里举个例子:
func responseDecodable(of type: T.Type = T.self,
queue: DispatchQueue = .main,
dataPreprocessor: DataPreprocessor = DecodableResponseSerializer.defaultDataPreprocessor,
decoder: DataDecoder = JSONDecoder(),
emptyResponseCodes: Set = DecodableResponseSerializer.defaultEmptyResponseCodes,
emptyRequestMethods: Set = DecodableResponseSerializer.defaultEmptyRequestMethods,
completionHandler: @escaping (AFDataResponse) -> Void) -> Self
eg:
struct HTTPBinResponse: Decodable { let url: String }
AF.request("https://httpbin.org/get").responseDecodable(of: HTTPBinResponse.self) { response in
debugPrint("Response: \(response)")
}
这样传输数据我们就不用来回的model转换了,定义好一个数据model就可以了。
先到这吧。接下来还有下载和上传文件等api接口,等我闲了再整理吧