Swift-Alamofire+HandyJSON(网络请求及转模型)

func loadData(_ latval:Double, _ lonval:Double) {
        weak var weakSelf = self
        // 参数
        var params = [String : Any]()
        params["cid"] = cid
        HWRequestManage<你的模型>.request(url: 请求url, params: params, success: { (model) in
            model.data // 就是你的模型    
        }) { (error) in
            print("错误信息:\(error)") 
        }
    }
    说明:
    请求的是模型数组只要添加[你的模型]即可
        HWRequestManage<[你的模型]>.request(url: 请求url, params: params, success: { (model) in
            model.data // 就是你的模型    
        }) { (error) in
            print("错误信息:\(error)") 
        }

请求模型(这个需要根据公司需求进行更改)

import UIKit
import HandyJSON
open class HWDataModel<T:Any> : HandyJSON {

    var data : T? // 主要数据
    var desc : String? = "" // 请求描述
    var status : Bool? = false // 请求成功与否
    var flag: String! // 标记
 
    /// 自定义 请求url
    var requestUrl : String = ""
    /// 自定义 请求数据
    var dataString : String = ""
    required public init() {}
}

封装

import UIKit
import HandyJSON
import Alamofire

class HWRequestManage<value:Any> {
    typealias valueBlock = ((HWDataModel<value>)->())?
    /// 请求头
    private static func setHttpHeader()->[String: String] {
//        let time = String(Int(NSDate().timeIntervalSince1970)*1000)
//        let md5 = "\(time)123123".getMd5()
//        let header = ["key":md5,
//                      "times":time,
//                      "language":"CN"]
        let header = [String:String]()
        return header
    }
    
    /// get请求
    static public func request(url:String,params:[String:Any]? = nil,success:valueBlock,failture:((String)->())?){
        var requestUrl = url
        if url.contains("http") == false {
            requestUrl = "\(AppURL)\(url)"
        }
        Alamofire.request(requestUrl, method : HTTPMethod.get, parameters : params, encoding : URLEncoding.default, headers : setHttpHeader()).hw_responseString { (model:DataResponse<HWDataModel<value>>) in
            if success != nil,model.value != nil{
                success!(model.value!)
            }
            if failture != nil,model.error != nil{
                let error: HWError = model.error as! HWError
                switch  error {
                case  .string(let string):
                    failture!(string)
                }
            }
        }
    }
     ///   url:请求url  images:图片数组  name:图片数组的参数名  params:请求参数  success:请求成功回调 failture:请求失败回调
    static public func upImage(url: String, images:[UIImage], name:String, params: [String: String]? = nil, success:valueBlock, failture:((String)->())?) {
        var requestUrl = url
        if url.contains("http") == false {
            requestUrl = "\(AppURL)\(url)"
        }
        Alamofire.upload(
            multipartFormData: { multipartFormData in
                for image in images {
                    // 对图片进行压缩
                    let imageData = UIImageJPEGRepresentation(image, 0.5)
                    // 如果需要上传多个文件,就多添加几个
                    multipartFormData.append(imageData!, withName: name, fileName: "ios.png", mimeType: "image/png")
                }
                if params != nil {
                    for (key, value) in params! {
                        multipartFormData.append((value.data(using: String.Encoding.utf8)!), withName: key)
                    }
                }
        },
            to: requestUrl,
            headers: setHttpHeader(),
            encodingCompletion: { (encodingResult) in
                switch encodingResult {
                case .success(let upload, _, _):
                    upload.hw_responseString(completionHandler: { (model:DataResponse<HWDataModel<value>>) in
                        if success != nil,model.value != nil{
                            success!(model.value!)
                        }
                        if failture != nil,model.error != nil{
                            let error: HWError = model.error as! HWError
                            switch  error {
                            case  .string(let string):
                                failture!(string)
                            }
                        }
                    })
                    // 获取上传进度
                    upload.uploadProgress(queue: DispatchQueue.global(qos: .utility)) { progress in
                        print("图片上传进度: \(progress.fractionCompleted)")
                    }
                case .failure(let encodingError):
                    //打印连接失败原因
                    print(encodingError)
                    if failture == nil {return}
                    failture!("网络请求错误")
                }
        })
    }
}
/// 对Alamofire进行扩展
extension DataRequest{
    @discardableResult
    public func hw_responseString<T:Any>(
        completionHandler: @escaping (DataResponse<HWDataModel<T>>) -> ())
        -> Self {
            let serializer = DataResponseSerializer<HWDataModel<T>> { (request, response, data, error) -> Result<HWDataModel<T>> in
                let requestUrl : String = String(describing: request?.url?.absoluteString ?? "")
                guard error == nil else {
                    print("请求失败:\(requestUrl)")
                    return .failure(HWError.string(string: "网络请求异常"))
                }
                if let response = response, hw_emptyDataStatusCodes.contains(response.statusCode) { return .success(HWDataModel<T>()) }
                guard let validData = data else {
                    print("请求失败:\(requestUrl)")
                    return .failure(HWError.string(string: "数据请求异常"))
                }
                do {
                    let json = try JSONSerialization.jsonObject(with: validData, options: JSONSerialization.ReadingOptions.allowFragments) as! [String:Any]
                    let model = HWDataModel<T>.deserialize(from: json)
                    if model != nil {
                        if model?.status == true{
                            model?.dataString = String(data:validData, encoding: String.Encoding.utf8) ?? ""
                            model?.requestUrl = requestUrl
                            return .success(model!)
                        }else{
                            print("请求失败:\(requestUrl)")
                            return .failure(HWError.string(string: (model?.desc) ?? ""))
                        }
                        
                    }else{
                        print("请求失败:\(requestUrl)")
                        return .failure(HWError.string(string: "数据请求异常"))
                    }
                } catch {
                    print("请求失败:\(requestUrl)")
                    return .failure(HWError.string(string: "网络请求异常"))
                }
            }
            return response(
                queue: DispatchQueue.main,
                responseSerializer: serializer,
                completionHandler: completionHandler
            )
    }
}
/// 对错误信息进行扩展
enum HWError: Error {
    case string(string:String)
}
/// A set of HTTP response status code that do not contain response data.
private let hw_emptyDataStatusCodes: Set<Int> = [204, 205]

更新 'Alamofire', '~> 5.4' 使用方法

import UIKit
import Alamofire
import HandyJSON

let AppURL = "" // 域名

open class HWDataModel<T:Any> : HandyJSON {
    
    var data : T? // 主要数据
    var code: Int = 0 // 200 成功 反之 失败
    var msg: String = "" // 请求描述
    
    /// 自定义 请求url
    var requestUrl : String = ""
    /// 自定义 请求数据
    var json : String = ""
    required public init() {}
}

class HWRequestManage<T:Any> {

    /// 请求头
    private static func setHttpHeader() -> [String: String] {
        var header = [String:String]()
        header = [
            "X-Requested-With":"XMLHttpRequest",
            "mfrs":"Apple"
        ]
        return header
    }
    
    /// get请求
    /// - Parameter url: URL
    /// - Parameter params: 请求参数
    /// - Parameter success: 请求成功回调
    /// - Parameter failture: 请求失败回调
    static public func get(_ url:String,_ params:[String:Any]? = nil,_ success:((HWDataModel<T>)->())?,_ failture:((String)->())? = nil){
        self.request(url, HTTPMethod.get, params, success, failture)
    }
    
    /// post请求
    /// - Parameter url: URL
    /// - Parameter params: 请求参数
    /// - Parameter success: 请求成功回调
    /// - Parameter failture: 请求失败回调
    static public func post(_ url:String,_ params:[String:Any]? = nil,_ success:((HWDataModel<T>)->())?,_ failture:((String)->())? = nil){
        self.request(url, HTTPMethod.post, params, success, failture)
    }
    
    /// 特殊请求 参数必须是[String:String]类型的
    static private func request(_ url:String, _ method:HTTPMethod,_ params:[String:Any]? = nil,_ success:((HWDataModel<T>)->())?,_ failture:((String)->())? = nil){
        var requestUrl = url
        if url.contains("http") == false {
            requestUrl = "\(AppURL)\(url)"
        }
        let headers = HTTPHeaders(setHttpHeader())
        AF.request(requestUrl, method: method, parameters: params, encoding: JSONParameterEncoder.default as! ParameterEncoding, headers: headers).responseJSON { (response) in
            switch response.result {
            case .success:
                guard let validData = response.data else {
                    print("数据请求异常:\(requestUrl)")
                    failture?("数据请求异常")
                    return
                }
                guard let json = String(data: validData, encoding: String.Encoding.utf8) else {
                    failture?("数据转换json失败")
                    return
                }
                print(json)
                guard let model = HWDataModel<T>.deserialize(from: json) else {
                    failture?("模型转换失败")
                    return
                }
                if model.code == 200 {
                    model.requestUrl = response.request?.url?.absoluteString ?? ""
                    model.json = json
                    success?(model)
                } else {
                    failture?(model.msg)
                }
                break
            case .failure:
                failture?("网络请求异常")
                break
            }
        }
    }
    
    //MARK: - 多图上传 (UIImage图片 数组)
    static public func upImages(_ url:String,_ params:[String:Any]? = nil,_ images:[UIImage],_ success: @escaping ([String:Any]) -> Void,_ failture:((String)->())? = nil) {
        let request = AF.upload(multipartFormData: { (mutilPartData) in
            var i:Int = 0
            for _:UIImage in images {
                //                let imgData:Data = image
                let imgData:Data = Data()
                let fileName = String(Date(timeIntervalSinceNow: 0).timeIntervalSince1970) + "_" + String(i) + ".jpg"
                mutilPartData.append(imgData, withName: "files", fileName: fileName, mimeType: "image/jpg/png/jpeg")
                i += 1
            }
            // 参数处理
            if (params != nil) {
                for key in params!.keys {
                    let value = params![key] as! String
                    let vData:Data = value.data(using: .utf8)!
                    mutilPartData.append(vData, withName: key)
                }
            }
        }, to: url, usingThreshold: UInt64.init(), method: .post, headers: [], interceptor: nil, fileManager: FileManager())
        
        request.uploadProgress { (progress) in
        }
        
        request.responseJSON { (response) in
            DispatchQueue.global().async(execute: {
                switch response.result {
                case let .success(result):
                    do {
                        let resultDict:[String:Any] = result as! [String:Any]
                        DispatchQueue.main.async(execute: {
                            success(resultDict)
                        })
                    }
                case let .failure(error):
                    print(error)
                    failture?("图片上传失败");
                }
            })
        }
    }
    
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,039评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,426评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,417评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,868评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,892评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,692评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,416评论 3 419
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,326评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,782评论 1 316
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,957评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,102评论 1 350
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,790评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,442评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,996评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,113评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,332评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,044评论 2 355

推荐阅读更多精彩内容