Alamofire的使用一:网络请求

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,其实上面两个接口调用的就是这个,这里我就随便截两个图看一下好了。


image.png

image.png
    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种不同的默认的数据响应处理程序,如图:

image.png

这里看到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接口,等我闲了再整理吧

你可能感兴趣的:(Alamofire的使用一:网络请求)