简单封装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<T: HandyJSON>: EKBaseResponse {
    var data: [T] = [T]()
}

class EKKVDataRespone<T: HandyJSON>: 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<Self>)->())?,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<Self>.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}]")

简单一步到位

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,686评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,668评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,160评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,736评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,847评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,043评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,129评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,872评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,318评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,645评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,777评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,861评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,589评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,687评论 2 351

推荐阅读更多精彩内容

  • 对于这个节日,好像是迫不得已的接受。因为最初对妇女一词的全部印象,是八卦,唠叨,不修边幅,自暴自弃。失却娇羞,甩弃...
    小缘小愿阅读 181评论 0 1
  • 做事不要拖 思虑不要多 有话就去说 切莫再错过
    缘渡阅读 145评论 0 2