// // NetWorkTools.swift // naiyoup // // Created by C Auto on 2021/6/2. // import Alamofire import HandyJSON import SwiftyUserDefaults public typealias Success = (T) -> Void public typealias Failure = (ErrorCode) -> Void public typealias FailureMsg = (String) -> Void //MARK: - headers let networkStaticHeaderKey = "topscommToken" let Authorization = "Authorization" let token = "token" let baseurl = "https://api.ruanjian.buzz" let baseurl2 = "https://api.ruanjian1.buzz" //MARK:-网络请求类型 public enum NetWorkType { case normalRequest case upload case download } //MARK:- 错误码 public enum ErrorCode{ //200...299 case invalidResponse(String) //actionResult中的 ’success‘为false case sysError(String) case tokenError(String) //其他错误 如 ‘failure’ 返回HTTP状态码 以及 错误信息描述 case networkUnavailable(String?,Int?) //重试 /** @param URLRequest 失败的request * @param NetWorkType 请求类型 * @param DataKey 获取数据的参数 * @param String 错误信息 */ case needRetrier(URLRequest,NetWorkType,String) // case switchServer(String,) /** * 上传失败 回调参数 * @param String 请求地址 * @param [String] 参数 * @param JSON 整个数据 * @param [Data] 数据信息 * @param [String] 数据信息描述 * @param String? 错误信息 */ case uploadError(String,[String],[Data],[String],String?) } class NetWorkTools { static var shared = NetWorkTools() private init () { } var sessionManger: Alamofire.Session = { let config = URLSessionConfiguration.default config.timeoutIntervalForRequest = 30 let manger = Alamofire.Session(configuration: config) return manger }() } extension NetWorkTools{ public static func GetBaidu() { shared.sessionManger.request("https://www.baidu.com", method: .get, parameters: [:]) .validate() .responseData { response in log.debug(response) } } /** * 基本请求方法 * @param url 请求地址 * @param param 参数 * @param method post get * @param dataKey 获取的数据部分 例如 data 下面的 ‘dataList’部分 * @param headers 请求头 * @param isNeedReConnect 需要重连 默认true 重连3次 * @param success 成功回调 * @param failure 失败回调 */ public static func getNormalRequestWith(url: String, param: Parameters, networkType:NetWorkType, method: HTTPMethod = .post, success: @escaping Success, failure: @escaping Failure) { var headers : HTTPHeaders{ if let data = Defaults[\.loginModel] { let loginM = JSONDeserializer.deserializeFrom(json: data) var tap = "Bearer " if loginM?.access_token != nil { tap = tap + (loginM?.access_token)! } return ["Authorization" : tap] } return [:] } shared.sessionManger.request(baseurl + url,method: method,parameters: param,encoding: URLEncoding.default,headers: headers) .validate() .responseData { response in switch response.result{ case .success: if let data = response.data { let json = String(data: data, encoding: String.Encoding.utf8) let info = JSONDeserializer.deserializeFrom(json: json) if info?.ret == 1 { if let val = info?.data { success(val) } else { failure(.sysError("失败解析")) } } else { failure(.sysError(info?.msg ?? "解析失败")) } } break case .failure(let error): if let code = response.response?.statusCode { if code == 500 || code == 502 || code == 503 || code == 504{ if let request = response.request { failure(.needRetrier(request, networkType, error.localizedDescription)) } } else if code == 401 { //token 失效,刷新token self.getTokenRefresh(url: "/api/client/v1/refresh",param: param, networkType: networkType, method: method, success: { v in if v { self.getSwitchServer(baserurl: baseurl2, url: url, param: param, networkType: networkType, method: method, success: success, failure: failure) }else { failure(.tokenError("重新登录")) } }, failure: failure) } else { failure(.sysError(error.localizedDescription)) } } else { //failure(.sysError(error.localizedDescription)) self.getSwitchServer(baserurl: baseurl2, url: url, param: param, networkType: networkType, method: method, success: success, failure: failure) } break } } } //刷新token private static func getTokenRefresh( url: String, param: Parameters, networkType: NetWorkType, method: HTTPMethod = .get, success: @escaping Success, failure: @escaping Failure ) { var headers : HTTPHeaders{ if let data = Defaults[\.loginModel] { let loginM = JSONDeserializer.deserializeFrom(json: data) var tap = "Bearer " if loginM?.access_token != nil { tap = tap + (loginM?.access_token)! } return ["Authorization" : tap] } return [:] } shared.sessionManger.request(baseurl2 + url, method: method, parameters: param, encoding: URLEncoding.default, headers: headers) .validate() //200...299 .responseJSON{ (response) in switch response.result { case .success: if let data = response.data { //let info = Mapper().map(JSONObject: data) let json = String(data: data, encoding: String.Encoding.utf8) let info = JSONDeserializer.deserializeFrom(json: json) if info?.ret == 1 { if let val = info?.data { let loginModel = JSONDeserializer.deserializeFrom(dict: val as? Dictionary) if let loginM = loginModel { //保存对象到序列 Defaults[\.loginModel] = loginM.toJSONString() ?? "" success(true) } else{ success(false) } } else { success(false) } } else { success(false) } } break case .failure(let error): if let code = response.response?.statusCode { if code == 500 || code == 502 || code == 503 || code == 504{ if let request = response.request { failure(.needRetrier(request, networkType, error.localizedDescription)) } } else if code == 401 { failure(.tokenError("重新登录,令牌失效")) } else { failure(.sysError(error.localizedDescription)) } } else { failure(.sysError(error.localizedDescription)) } break } } } //MARK:- 重试方法 public static func getRetrierRequest(request:URLRequest, networkType: NetWorkType, success: @escaping Success, failure: @escaping Failure) { var headers : HTTPHeaders{ if let data = Defaults[\.loginModel] { let loginM = JSONDeserializer.deserializeFrom(json: data) var tap = "Bearer " if loginM?.access_token != nil { tap = tap + (loginM?.access_token)! } return ["Authorization" : tap] } return [:] } shared.sessionManger.request(request).validate().responseJSON{ (response) in if let error = response.error { failure(.invalidResponse(error.localizedDescription)) } switch response.result { case .success: if let data = response.data { //let info = Mapper().map(JSONObject: data) let json = String(data: data, encoding: String.Encoding.utf8) let info = JSONDeserializer.deserializeFrom(json: json) if info?.ret == 1 { if let val = info?.data { success(val) } } else { //返回错误的信息 failure(.sysError(info?.msg ?? "")) } } break case .failure(let error): if let code = response.response?.statusCode { if code == 500 || code == 502 || code == 503 || code == 504 { if let request = response.request { failure(.needRetrier(request, networkType, error.localizedDescription)) } } else { failure(.sysError(error.localizedDescription)) } } else { failure(.sysError(error.localizedDescription)) } } } } public static func getSwitchServer(baserurl:String,url: String, param: Parameters, networkType:NetWorkType, method: HTTPMethod = .post, success: @escaping Success, failure: @escaping Failure) { var headers : HTTPHeaders{ if let data = Defaults[\.loginModel] { let loginM = JSONDeserializer.deserializeFrom(json: data) var tap = "Bearer " if loginM?.access_token != nil { tap = tap + (loginM?.access_token)! } return ["Authorization" : tap] } return [:] } shared.sessionManger.request(baserurl + url, method: method, parameters: param, encoding: URLEncoding.default, headers: headers) .validate() //200...299 .responseJSON{ (response) in switch response.result { case .success: if let data = response.data { //let info = Mapper().map(JSONObject: data) let json = String(data: data, encoding: String.Encoding.utf8) let info = JSONDeserializer.deserializeFrom(json: json) if info?.ret == 1 { if let val = info?.data { success(val) } } else { //返回错误的信息 failure(.sysError(info?.msg ?? "")) } } break case .failure(let error): if let code = response.response?.statusCode { if code == 500 || code == 502 || code == 503 || code == 504{ if let request = response.request { //request.urlRequest //request.url = URL(string: "") failure(.needRetrier(request, networkType, error.localizedDescription)) } } else { failure(.sysError(error.localizedDescription)) } } else { failure(.sysError(error.localizedDescription)) } break } } } }