美文网首页
封装Alamofire+SwiftyJSON进行网络请求:

封装Alamofire+SwiftyJSON进行网络请求:

作者: 歌手的剑 | 来源:发表于2017-05-04 19:13 被阅读1868次

    NetworkTools类封装

    import UIKit
    import Alamofire
    import SwiftyJSON
    
    /// 请求响应状态
    ///
    /// - success: 响应成功
    /// - unusual: 响应异常
    /// - failure: 请求错误
    enum ResponseStatus: Int {
        case success  = 0
        case unusual  = 1
        case failure  = 3
    }
    
    /// 网络请求回调闭包 status:响应状态 result:JSON tipString:提示给用户的信息
    typealias NetworkFinished = (_ status: ResponseStatus, _ result: JSON?, _ tipString: String?) -> ()
    
    class NetworkTools: NSObject {
        
        /// 网络工具类单例
        static let shared = NetworkTools()
        
        var rootDomain: String {
            #if DEBUG
                return URL_ROOT_DOMAIN_DEBUG + URL_SUB_DOMAIN
            #else
                return URL_ROOT_DOMAIN_RELEASE + URL_SUB_DOMAIN
            #endif
        }
        
    }
    
    // MARK: - 基础请求方法
    extension NetworkTools {
        //    in view: UIView = UIApplication.shared.keyWindow!,title: String? = nil
        /**
         GET请求
         
         - parameter URLString:  urlString
         - parameter parameters: 参数
         - parameter finished:   完成回调
         */
        func get(_ APIString: String, parameters: [String : Any]?, needHeaders: Bool = true, needLoading: Bool = false, finished: @escaping NetworkFinished) {
            
            if needLoading {
                HexaLoading.show(in: UIApplication.shared.keyWindow!)
            }
            
            let headers = needHeaders ? self.headers() : nil
            
            DLog("\n🌎🌎🌎\nRequest: \nURL: \(rootDomain + APIString)\nMethod: get\nHeaders:\(String(describing: headers))\nParameters: \(String(describing: parameters))\n🌎🌎🌎")
            
            Alamofire.request(rootDomain + APIString, method: .get, parameters: parameters, headers: headers).responseJSON { (response) in
                self.handle(response: response, finished: finished, needLoading: needLoading)
            }
            
        }
        
        /**
         POST请求
         
         - parameter URLString:  urlString
         - parameter parameters: 参数
         - parameter finished:   完成回调
         */
        func post(_ APIString: String, parameters: [String : Any]?, needHeaders: Bool = true, needLoading: Bool = false, finished: @escaping NetworkFinished) {
            
            
            if needLoading {
                HexaLoading.show()
            }
            
            let headers = needHeaders ? self.headers() : nil
            
            DLog("\n🌎🌎🌎\nRequest: \nURL: \(rootDomain + APIString)\nMethod: post\nHeaders:\(String(describing: headers))\nParameters: \(String(describing: parameters))\n🌎🌎🌎")
            
            Alamofire.request(rootDomain + APIString, method: .post, parameters: parameters, headers: headers).responseJSON { (response) in
                self.handle(response: response, finished: finished, needLoading: needLoading)
            }
        }
        
        /// 处理响应结果
        ///
        /// - Parameters:
        ///   - response: 响应对象
        ///   - finished: 完成回调
        fileprivate func handle(response: DataResponse<Any>, finished: @escaping NetworkFinished, needLoading: Bool) {
    
            if needLoading {
                HexaLoading.hide()
            }
            
            switch response.result {
            case .success(let value):
                let json = JSON(value)
                DLog(json)
                if json["code"].string == "OK" {
                    finished(.success, json, json["message"].string)
                } else {
                    finished(.unusual, json, json["message"].string)
                }
            case .failure(let error):
                DLog(error)
                finished(.failure, nil, error.localizedDescription)
            }
        }
        
        /// 获取请求头
        ///
        /// - Returns: 字典-请求头内容
        fileprivate func headers() -> Dictionary<String, String>! {
            
            let acceptLanguage = Locale.preferredLanguages
                .prefix(6)
                .enumerated()
                .map { index, languageCode in
                    let quality = 1.0 - (Double(index) * 0.1)
                    return "\(languageCode),q=\(quality)"
                }
                .joined(separator: ", ")
            
            let userAgent: String = {
                if let info = Bundle.main.infoDictionary {
                    return "HEXA/iOS/" + (info["CFBundleShortVersionString"] as? String ?? "Unknown")
                }
                return "HEXA/iOS/Unknown"
            }()
            
            return [
                "Accept-Encoding": "gzip;q=1.0, compress;q=0.5",
                "Accept-Language": acceptLanguage,
                "User-Agent": userAgent,
                
                "X-App-OSVersion": UIDevice.systemVersionName,
                "X-App-Device": UIDevice.machineModelName,
                "X-User-AccessToken": UserDefaults.standard.string(forKey: ACCESSTOKEN_KEY) ?? ""
            ]
        }
        
    }
    

    调用过程

            NetworkTools.shared.get(URL_CHECKUPDATE, parameters: nil, needLoading: true) {
                DLog($0)
                DLog($1)
                DLog($2)
            }
    

    相关文章

      网友评论

          本文标题:封装Alamofire+SwiftyJSON进行网络请求:

          本文链接:https://www.haomeiwen.com/subject/xlydtxtx.html