iOS swift Alamofire+HandyJSON网络框架封装
我们在学习Objective_C时使用的网络框架是AFNetworking+MJExtension,而在swift中Alamofire+HandyJSON取代了它,如果你是第一次学习和尝试封装swift的网络框架,可能会遇到一些坑,但踩过这些坑之后你会对Alamofire+HandyJSON的认识加深,能更好地理解swift网络请求中数据解析的一个原理和规则。我个人封装了一个简单的网络框架,有待优化的地方还请指正,下面是源码:
1、封装的网络接口方法
func yb_request<T : HandyJSON>(path : String,params : [String:Any]?,block : @escaping (handJsonModel<T>) -> Void){
// 验证服务器的公钥
// 默认获取了 cer 结尾的文件,只需要把证书放到项目里边就行了,不需要显示指定
// let trustManager = ServerTrustManager(evaluators: [
// "serverUrl": PublicKeysTrustEvaluator()
// ])
//alamofire5.0双向认证
// let session = Session(delegate: WSSessionDelegate(), serverTrustManager: trustManager)
//网络超时
let url = baseUrl + path
AF.session.configuration.timeoutIntervalForRequest = 30
//当前时间戳
let openTime : TimeInterval = Date().timeIntervalSince1970
let openTimeStr : String = String(Int(openTime))
//当前版本
let version : String = "5.22"
//字典转json
var reqDataBase64 : String!
if params != nil {
if (!JSONSerialization.isValidJSONObject(params ?? [])) {
print("无法解析出JSONString")
return
}
let paramsData = try? JSONSerialization.data(withJSONObject: params ?? [], options: [])
let jsonStr = String(data: paramsData!, encoding: String.Encoding.utf8)! as String
let data = jsonStr.data(using: String.Encoding.utf8)
reqDataBase64 = data?.base64EncodedString(options: NSData.Base64EncodingOptions.init(rawValue: 0))
}else{
reqDataBase64 = ""
}
//签名
let discription : String! = openTimeStr + pid + reqDataBase64
let handler : HBRSAHandler = HBRSAHandler.init()
let ret : Bool = handler.importKey(with: KeyTypePrivate, andkeyString: privateKey)
print(String(ret) + "请检查RSA的配置")
let signedString : String = handler.sign(discription)
let parameters : [String : String]! = ["pid":pid,"version":version,"opentime":openTimeStr,"reqdata":reqDataBase64,"sign":signedString,"sessionId":""]
let headers: HTTPHeaders = [
"Accept" : "application/json",
"Connection" : "keep-alive",
"Content-Type" : "application/json;charset=UTF-8;"
]
AF.request(url, method: HTTPMethod.post,parameters: parameters,encoding: JSONEncoding.default,headers: headers).responseDecodable {(response:DataResponse<encodableModel, AFError>) in
let json = try? JSONSerialization.jsonObject(with: response.data!,options:[.mutableContainers,.mutableLeaves,.fragmentsAllowed])
let dic = json as! Dictionary<String, Any>
let result = handJsonModel<T>.deserialize(from: dic)
print("接口返回数据 --- \n\(dic)")
block(result!)
}
}
2、对接口返回数据的解析,以下是我定义的几个数据模型model,根据接口的返回格式,定义符合你个人需求的模型,我们需要的模型是继承HandyJSON的,因为我们请求中的范型是指向HandyJSON类型的
3、接口方法和模型整理好之后,下面给大家介绍下简单的使用,简单粗暴的打印出返回列表数组中的某一个model元素信息
真香!赶紧自己体验下封装swift的网络框架吧。