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 + pathAF.session.configuration.timeoutIntervalForRequest = 30//当前时间戳let openTime : TimeInterval = Date().timeIntervalSince1970let openTimeStr : String = String(Int(openTime))//当前版本let version : String = "5.22"//字典转jsonvar 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 Stringlet data = jsonStr.data(using: String.Encoding.utf8)reqDataBase64 = data?.base64EncodedString(options: NSData.Base64EncodingOptions.init(rawValue: 0))}else{reqDataBase64 = ""}//签名let discription : String! = openTimeStr + pid + reqDataBase64let 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>) inlet 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的网络框架吧。