前言:
Alamofire是一个使用Swift开发的网络请求库,其开发团队是AFNetworking的原团队。它语法简洁,采用链式编程
的思想,本质是基于NSURLSession
进行封装。在此基础上,答主再次封装成了一个可以便捷使用的工具类,实现了链式调用
以及OC风格调用
两种调用方式。
依赖:Alamofire5.4.4,HandyJSON
正文:
- 根据后台返回数据格式定义
BaseModel
,便于在接收到后台返回数据后,能够对数据进行初步处理,比如404、token失效等...
import HandyJSON
class BaseModel: HandyJSON {
required init() {}
///数据
var data: Any?
/// status信息
var status: StatusModel?
}
/// status模型
struct StatusModel: HandyJSON {
var code: String? // 此处可以根据后台返回自定义
var errorCode: String? // 错误码
var errorDescription: String? // 错误描述文字
}
-
BaseModel
建立以后,就可以正式开始准备搭建网络请求工具类了。
- 请求成功/失败的闭包
typealias SuccessHandlerType = ((NSDictionary) -> Void)
typealias FailureHandlerType = ((Any?, String) ->Void)
- 私有参数
private var requestType: HTTPMethod = .post // 请求类型
private var url: String? // URL
private var params: [String: Any]? // 参数
private var hintText: String? // 提示语
private var success: SuccessHandlerType? // 成功的回调
private var failure: FailureHandlerType? // 失败的回调
private var httpRequest: Request?
private var headers: HTTPHeaders? // headers设置
- 实现链式语法
///设置url
func url(_ url: String?) -> Self {
self.url = url ?? ""
return self
}
/// 设置post/get 默认post
func requestType(_ type: HTTPMethod) -> Self {
self.requestType = type
return self
}
/// 设置参数
func params(_ params: [String: Any]?) -> Self {
self.params = params
return self
}
/// 成功的回调
func success(_ handler: @escaping SuccessHandlerType) -> Self {
self.success = handler
return self
}
只写了部分,详细代码底部有Demo...
- 定义发起请求方法
request()
注意:
request()
方法要在链式语法的最后调用
///发起请求 设置好相关参数后再调用
func request() -> Void {
var dataRequest: DataRequest? // alamofire请求后的返回值
//发起请求
if let URLString = url {
// 提示语句
if let hint = hintText {
// HUDTool.showLoading(hint)
}
// headers处理
var requestHeaders = HTTPHeaders()
if let header = headers {
requestHeaders = header
} else {
// 否则取默认值
requestHeaders.add(name: "Content-Type", value: "application/json;charset=utf-8")
requestHeaders.add(name: "Accept", value: "application/json")
}
//发起网络请求
AF.sessionConfiguration.timeoutIntervalForRequest = 60
dataRequest = AF.request(URLString,
method: requestType,
parameters: params,
encoding: URLEncoding.default,
headers: requestHeaders,
interceptor: nil,
requestModifier: nil).validate()
httpRequest = dataRequest
}
// 处理返回数据
dataRequest?.responseJSON { (response) in
// 如果有返回值
guard let data = response.value else {
self.hideHUD()
if let failureBlock = self.failure {
failureBlock(response.error?.responseCode,
response.error?.localizedDescription ?? "出现了点反常的状况,请检查网络后再试。")
}
return
}
switch response.result {
case .success(_):
// ***********这里可以统一处理错误码,统一弹出错误 ****
guard let baseModel = BaseModel.deserialize(from: data as? NSDictionary)
else {
if let failureBlock = self.failure {
failureBlock(response.error?.responseCode,
"出现了点反常的状况,请检查网络后再试。")
}
return
}
// 成功
if let successBlock = self.success {
successBlock(baseModel.data as! NSDictionary)
}
case let .failure(error):
self.hideHUD()
if let failureBlack = self.failure {
failureBlack(nil, error.localizedDescription)
}
}
}
- 如何调用。
Network()
.requestType(.post)
.url("")
.params(nil)
.headers(nil)
.hintText("加载中")
.success { data in
}.failure { code, message in
}.request()
关于类似OC的学法:
这里就不一一赘述了,底部的Demo地址中有详细的代码。。