简单封装Alamofire,使用HandyJson解析模型

HandyJson解析模型文档请移步:HandyJson,阿里巴巴出品,目前2k多星
本文章githubDemo代码
摘抄一段介绍:

HandyJSON是一个用于Swift语言中的JSON序列化/反序列化库。

与其他流行的Swift JSON库相比,HandyJSON的特点是,它支持纯swift类,使用也简单。它反序列化时(把JSON转换为Model)不要求Model从NSObject继承(因为它不是基于KVC机制),也不要求你为Model定义一个Mapping函数。只要你定义好Model类,声明它服从HandyJSON协议,HandyJSON就能自行以各个属性的属性名为Key,从JSON串中解析值。

HandyJSON目前依赖于从Swift Runtime源码中推断的内存规则,任何变动我们将随时跟进。

进入正题: 封装我们的Alamofire:
这里只是简单的封装,一般接口返回的都是json格式的,所以使用responseJSON这个方法就可以了

import Alamofire

let api_baseUrl = ""
class ARNetworkTool {
    @discardableResult class func post(url: String,baseUrl: String = api_baseUrl,params: [String: Any]?,success: ((Any)->())?,failure: ((Error)->())?) -> DataRequest?{ 
        guard let ar_url = URL(string: baseUrl+url) else {
            return nil
        }
        return Alamofire.request(ar_url, method: .post, parameters: params, encoding: URLEncoding(), headers: nil).responseJSON { (data) in
            ///如果成功的话,result.value是一个已经解析好的字典 
            ///失败的会有error可以回去错误信息
            if data.result.isSuccess {
                if let _data = data.value {
                    success?(_data)
                }else{
                    success?([:])
                }
            }else{
                failure?(data.error!)
            }
        }
    }
}

根据接口返回的内容来实现响应的模型,比如我的接口返回的json格式是:

{
    "code": "10200",
    "message": "成功",
    "data": [
        {
          "user_id": 81,
          "sex": 0,
          "age": 15,
          "number": "xx123456",
          "identification": "123456789123456",
          "job": "php开发",
          "real_name": "文文"
        }
    ]
}

实现的响应模型 这样可以

class EKBaseResponse: HandyJSON {
    var code: Int = 0 // 服务端返回码
   
    var message: String = ""
    public required init() {}
}

class EKDataResponse: EKBaseResponse {
    var data: [T] = [T]()
}

class EKKVDataRespone: EKBaseResponse {
    var data: T?
    
}
/// 模型基类  创建模型的时候继承   可以不用import HandyJSON 
class EKBaseModel: HandyJSON ,EKResponseProtocol{
    required init () {}
}
class UserModel: EKBaseModel {
//    "user_id": 81,
    var user_id = 0
//    "sex": 0,
    var sex = 0
//    "age": 15,
    var age = 0
//    "number": "xx123456",
    var number = ""
//    "identification": "123456789123456",
    var identification = ""
//    "job": "php开发",
    var job = ""
//    "real_name": "文文"
    var real_name = ""
}

然后 定义一个协议,只要遵守了我们的协议的模型,调用协议方法,就会得到包裹我们模型数组(或者模型本身,根据实际情况定义)的response类

protocol EKResponseProtocol {
   
}
extension EKResponseProtocol where Self : HandyJSON {
    static func request(with url: String,params: [String:Any]?,success:((EKDataResponse)->())?,failure:((String)->())?) {
        ARNetworkTool.post(url: url, params: params, success: { (data) in
            guard let dict = data as? [String : Any] else {
                failure?("模型解析失败")
                return
            }
            guard let dataRp = EKDataResponse.deserialize(from: dict) else {
                failure?("模型解析失败")
                return
            }
            success?(dataRp)
        }) { (error) in
            failure?("失败原因")
        }
    }
}

然后网络请求如下:

 UserModel.request(with: "", params: nil, success: { (rp) in
            print(rp.code)
            print(rp.message)
            print(rp.data.toJSONString())
        }, failure: nil)
///控制台输出:
//    10200
//    成功
//    Optional("[{\"real_name\":\"文文\",\"job\":\"php开发\",\"age\":15,\"number\":\"xx123456\",\"user_id\":81,\"identification\":\"123456789123456\",\"sex\":0}]")

简单一步到位

你可能感兴趣的:(简单封装Alamofire,使用HandyJson解析模型)