| | |
| | | |
| | | // 假设这是服务端返回的统一定义的response格式 |
| | | struct BaseResponse<T :HandyJSON>: HandyJSON { |
| | | var sysTime: Int = 0 |
| | | var code: Int = -1 // 服务端返回码 |
| | | var data: T? = nil // 具体的data的格式和业务相关,故用泛型定义 |
| | | var msg: String = "" |
| | | var sysTime: Int = 0 |
| | | var code: Int = -1 // 服务端返回码 |
| | | var data: T? = nil // 具体的data的格式和业务相关,故用泛型定义 |
| | | var msg: String = "" |
| | | } |
| | | |
| | | struct BaseData<T: HandyJSON>: HandyJSON { |
| | | var records = [T]() |
| | | var records = [T]() |
| | | } |
| | | |
| | | struct SimpleModel: HandyJSON { |
| | | |
| | | } |
| | | struct HtmlModel: HandyJSON { |
| | | var content = "" |
| | | var content1 = "" |
| | | var id = 0 |
| | | var type = 0 |
| | | var content = "" |
| | | var content1 = "" |
| | | var id = 0 |
| | | var type = 0 |
| | | } |
| | | |
| | | extension String: HandyJSON{ |
| | |
| | | let SHAKEY = "" |
| | | |
| | | class ParamsAppender: NSObject { |
| | | var url: URL |
| | | var params:Dictionary = [String: Any]() |
| | | var url: URL |
| | | var params:Dictionary = [String: Any]() |
| | | |
| | | private init(url: String){ |
| | | self.url = URL(string: url)! |
| | | } |
| | | private init(url: String){ |
| | | self.url = URL(string: url)! |
| | | } |
| | | |
| | | @discardableResult |
| | | func interface(url: String) -> ParamsAppender { |
| | | self.url.appendPathComponent(url) |
| | | return self |
| | | } |
| | | @discardableResult |
| | | func interface(url: String) -> ParamsAppender { |
| | | self.url.appendPathComponent(url) |
| | | return self |
| | | } |
| | | |
| | | @discardableResult |
| | | func append(key: String,value: Bool) -> ParamsAppender { |
| | | params += ["\(key)":"\(value)"] |
| | | return self |
| | | } |
| | | @discardableResult |
| | | func append(key: String,value: Bool) -> ParamsAppender { |
| | | params += ["\(key)":"\(value)"] |
| | | return self |
| | | } |
| | | |
| | | @discardableResult |
| | | func append(key: String,value: String?) -> ParamsAppender { |
| | | if value != nil && value?.isEmpty == false { |
| | | params += ["\(key)":"\(value!)"] |
| | | } |
| | | return self |
| | | } |
| | | @discardableResult |
| | | func append(key: String,value: String?) -> ParamsAppender { |
| | | if value != nil && value?.isEmpty == false { |
| | | params += ["\(key)":"\(value!)"] |
| | | } |
| | | return self |
| | | } |
| | | |
| | | @discardableResult |
| | | func append(key: String,value: Array<String>) -> ParamsAppender { |
| | | if value.isEmpty == false { |
| | | params += ["\(key)":value] |
| | | } |
| | | return self |
| | | } |
| | | @discardableResult |
| | | func append(key: String,value: Array<String>) -> ParamsAppender { |
| | | if value.isEmpty == false { |
| | | params += ["\(key)":value] |
| | | } |
| | | return self |
| | | } |
| | | |
| | | |
| | | @discardableResult |
| | | func append(key: String, value: Int?) -> ParamsAppender { |
| | | if value != nil{ |
| | | params += ["\(key)":value!] |
| | | } |
| | | return self |
| | | } |
| | | @discardableResult |
| | | func append(key: String, value: Int?) -> ParamsAppender { |
| | | if value != nil{ |
| | | params += ["\(key)":value!] |
| | | } |
| | | return self |
| | | } |
| | | |
| | | @discardableResult |
| | | func append(key: String, value: Int64) -> ParamsAppender { |
| | | params += ["\(key)":value] |
| | | return self |
| | | } |
| | | @discardableResult |
| | | func append(key: String, value: Int64) -> ParamsAppender { |
| | | params += ["\(key)":value] |
| | | return self |
| | | } |
| | | |
| | | @discardableResult |
| | | func append(key: String, value: Double?) -> ParamsAppender { |
| | | if value != nil{ |
| | | params += ["\(key)":value!] |
| | | } |
| | | return self |
| | | } |
| | | @discardableResult |
| | | func append(key: String, value: Double?) -> ParamsAppender { |
| | | if value != nil{ |
| | | params += ["\(key)":value!] |
| | | } |
| | | return self |
| | | } |
| | | |
| | | @discardableResult |
| | | func append(key: String,data: Data?) -> ParamsAppender { |
| | | if data != nil{ |
| | | params += ["\(key)": data!] |
| | | } |
| | | return self |
| | | } |
| | | @discardableResult |
| | | func append(key: String,data: Data?) -> ParamsAppender { |
| | | if data != nil{ |
| | | params += ["\(key)": data!] |
| | | } |
| | | return self |
| | | } |
| | | |
| | | @discardableResult |
| | | func append(key: String,url: URL) -> ParamsAppender { |
| | | params += ["\(key)":"\(url)"] |
| | | return self |
| | | } |
| | | @discardableResult |
| | | func append(key: String,url: URL) -> ParamsAppender { |
| | | params += ["\(key)":"\(url)"] |
| | | return self |
| | | } |
| | | |
| | | @discardableResult |
| | | func append(dic: [String : Any]) -> ParamsAppender { |
| | | params += dic |
| | | return self |
| | | } |
| | | @discardableResult |
| | | func append(dic: [String : Any]) -> ParamsAppender { |
| | | params += dic |
| | | return self |
| | | } |
| | | |
| | | /// 参数加密 |
| | | @discardableResult |
| | | func done() -> Parameters { |
| | | var paramsArray: [String] = [] |
| | | // 排序 |
| | | let sortedArray: [String] = Array(params.keys).sorted() |
| | | /// 参数加密 |
| | | @discardableResult |
| | | func done() -> Parameters { |
| | | var paramsArray: [String] = [] |
| | | // 排序 |
| | | let sortedArray: [String] = Array(params.keys).sorted() |
| | | |
| | | //防止自签名而错误 |
| | | if !sortedArray.contains("sign"){ |
| | | for item in sortedArray{ |
| | | // 拼接字符串 |
| | | if params.has(key: item){ |
| | | paramsArray.append("\(item)=\(params[item]!)") |
| | | } |
| | | } |
| | | let content = paramsArray.joined(separator: "&") |
| | | params += ["sign": "\(content.jq_hmacBase64(algorithm: .SHA1, key: SHAKEY))"] |
| | | //防止自签名而错误 |
| | | if !sortedArray.contains("sign"){ |
| | | for item in sortedArray{ |
| | | // 拼接字符串 |
| | | if params.has(key: item){ |
| | | paramsArray.append("\(item)=\(params[item]!)") |
| | | } |
| | | } |
| | | let content = paramsArray.joined(separator: "&") |
| | | params += ["sign": "\(content.jq_hmacBase64(algorithm: .SHA1, key: SHAKEY))"] |
| | | |
| | | #if DEBUG |
| | | LogInfo("签名:\(content) ----- \(content.jq_hmacBase64(algorithm: .SHA1, key: SHAKEY))") |
| | | LogInfo("签名:\(content) ----- \(content.jq_hmacBase64(algorithm: .SHA1, key: SHAKEY))") |
| | | #endif |
| | | } |
| | | return self.params |
| | | } |
| | | } |
| | | return self.params |
| | | } |
| | | |
| | | class func build(url: String) -> ParamsAppender { |
| | | return ParamsAppender(url: url) |
| | | } |
| | | class func build(url: String) -> ParamsAppender { |
| | | return ParamsAppender(url: url) |
| | | } |
| | | |
| | | } |
| | | class NetworkRequest { |
| | | |
| | | static let sharedSessionManager: Alamofire.Session = { |
| | | let configuration = URLSessionConfiguration.default |
| | | configuration.timeoutIntervalForRequest = 10 |
| | | return Alamofire.Session(configuration: configuration) |
| | | }() |
| | | enum NetRequestError: Error { |
| | | case Other(Int,String) |
| | | case URLNotFound |
| | | case DownloadFailed |
| | | case InvaildSession |
| | | case ModelError(String) |
| | | case DataAnalysis(String) |
| | | } |
| | | static let sharedSessionManager: Alamofire.Session = { |
| | | let configuration = URLSessionConfiguration.default |
| | | configuration.timeoutIntervalForRequest = 10 |
| | | return Alamofire.Session(configuration: configuration) |
| | | }() |
| | | enum NetRequestError: Error { |
| | | case Other(Int,String) |
| | | case URLNotFound |
| | | case DownloadFailed |
| | | case InvaildSession |
| | | case ModelError(String) |
| | | case DataAnalysis(String) |
| | | } |
| | | |
| | | class func request<T: HandyJSON>(params: ParamsAppender, method: HTTPMethod, encoding: ParameterEncoding? = nil, progress: Bool = true,ignoreAlert:Bool = false) -> Observable<BaseResponse<T>>{ |
| | | class func request<T: HandyJSON>(params: ParamsAppender, method: HTTPMethod, encoding: ParameterEncoding? = nil, progress: Bool = true,ignoreAlert:Bool = false) -> Observable<BaseResponse<T>>{ |
| | | |
| | | return Observable<BaseResponse<T>>.create{ ob in |
| | | guard NetworkReachabilityManager.init(host: All_Url)!.isReachable else { |
| | | alertError(msg: "当前网络不可用") |
| | | ob.onError(AFError.invalidURL(url: params.url)) |
| | | return Disposables.create{} |
| | | } |
| | | return Observable<BaseResponse<T>>.create{ ob in |
| | | guard NetworkReachabilityManager.init(host: All_Url)!.isReachable else { |
| | | alertError(msg: "当前网络不可用") |
| | | ob.onError(AFError.invalidURL(url: params.url)) |
| | | return Disposables.create{} |
| | | } |
| | | |
| | | if progress {showHUD()} |
| | | if progress {showHUD()} |
| | | |
| | | var headers = HTTPHeaders() |
| | | var headers = HTTPHeaders() |
| | | |
| | | if let token = LoginTokenModel.getToken()?.access_token{ |
| | | headers.add(name: "Authorization", value: "Bearer" + " " + token) |
| | | LogInfo("USER_token:Bearer \(token)") |
| | | } |
| | | if let token = LoginTokenModel.getToken()?.access_token{ |
| | | headers.add(name: "Authorization", value: "Bearer" + " " + token) |
| | | LogInfo("USER_token:Bearer \(token)") |
| | | } |
| | | |
| | | if encoding is JSONEncoding { |
| | | headers.add(name: "Content-Type", value: "application/json;charset=UTF-8") |
| | | } |
| | | if encoding is JSONEncoding { |
| | | headers.add(name: "Content-Type", value: "application/json;charset=UTF-8") |
| | | } |
| | | |
| | | var newEncoding: ParameterEncoding |
| | | if encoding != nil { |
| | | newEncoding = encoding! |
| | | } else { |
| | | newEncoding = method == .post ? URLEncoding.httpBody : URLEncoding.queryString |
| | | } |
| | | var newEncoding: ParameterEncoding |
| | | if encoding != nil { |
| | | newEncoding = encoding! |
| | | } else { |
| | | newEncoding = method == .post ? URLEncoding.httpBody : URLEncoding.queryString |
| | | } |
| | | |
| | | sharedSessionManager.request(params.url.absoluteString, method: method, parameters:params.done(), encoding: newEncoding, headers:headers).validate().responseData{response in |
| | | LogInfo("请求地址:\(params.url)") |
| | | LogInfo("请求参数:\(params.params)") |
| | | if progress{hiddenHUD()} |
| | | sharedSessionManager.request(params.url.absoluteString, method: method, parameters:params.done(), encoding: newEncoding, headers:headers).validate().responseData{response in |
| | | LogInfo("请求地址:\(params.url)") |
| | | LogInfo("请求参数:\(params.params)") |
| | | if progress{hiddenHUD()} |
| | | |
| | | guard response.error == nil else { |
| | | LogError("\(response.error!)") |
| | | guard response.error == nil else { |
| | | LogError("\(response.error!)") |
| | | |
| | | var errorString = "" |
| | | errorString.append("服务器故障:\(response.error!.localizedDescription)") |
| | | if let code = response.error?.responseCode{ |
| | | errorString.append("\n【错误码:\(code)】") |
| | | } |
| | | if !ignoreAlert{ |
| | | alert(msg: errorString) |
| | | } |
| | | ob.onError(response.error!) |
| | | return |
| | | } |
| | | if let data = response.data,let jsonString = String(data: data, encoding: String.Encoding.utf8){ |
| | | LogResponse(try! JSONSerialization.jsonObject(with: data)) |
| | | if let next = BaseResponse<T>.deserialize(from: jsonString){ |
| | | switch next.code{ |
| | | case 200:ob.onNext(next) |
| | | case 506: |
| | | ob.onError(NetRequestError.Other(next.code,next.msg)) |
| | | case 502: //登录被冻结 |
| | | CommonAlertView.show(isSinple: true, content: next.msg) |
| | | case 501: |
| | | CommonAlertView.show(content: "以下内容仅限会员查看,请先成为会员!", completeTitle: "成为会员") { |
| | | let vc = VIPCenterVC() |
| | | vc.title = "会员中心" |
| | | JQ_currentNavigationController().pushViewController(vc) |
| | | var errorString = "" |
| | | errorString.append("服务器故障:\(response.error!.localizedDescription)") |
| | | if let code = response.error?.responseCode{ |
| | | errorString.append("\n【错误码:\(code)】") |
| | | } |
| | | if !ignoreAlert{ |
| | | alert(msg: errorString) |
| | | } |
| | | ob.onError(response.error!) |
| | | return |
| | | } |
| | | if let data = response.data,let jsonString = String(data: data, encoding: String.Encoding.utf8){ |
| | | LogResponse(try! JSONSerialization.jsonObject(with: data)) |
| | | if let next = BaseResponse<T>.deserialize(from: jsonString){ |
| | | switch next.code{ |
| | | case 200:ob.onNext(next) |
| | | case 506: |
| | | ob.onError(NetRequestError.Other(next.code,next.msg)) |
| | | case 502: //登录被冻结 |
| | | CommonAlertView.show(isSinple: true, content: next.msg) |
| | | case 501: |
| | | CommonAlertView.show(content: "以下内容仅限会员查看,请先成为会员!", completeTitle: "成为会员") { |
| | | let vc = VIPCenterVC() |
| | | vc.title = "会员中心" |
| | | JQ_currentNavigationController().pushViewController(vc) |
| | | |
| | | } cancelClouse: { |
| | | } cancelClouse: { |
| | | |
| | | } |
| | | case 401,505,600: |
| | | if !ignoreAlert{ |
| | | alertError(msg: "登录失效,请重新登录");ob.onError(NetRequestError.InvaildSession) |
| | | } |
| | | sceneDelegate?.needLogin() |
| | | default: |
| | | //503是手机验证码错误 |
| | | if !ignoreAlert{ |
| | | DispatchQueue.main.async { |
| | | alertError(msg: "\(next.msg)") |
| | | } |
| | | } |
| | | ob.onError(NetRequestError.Other(next.code,next.msg)) |
| | | } |
| | | } |
| | | } |
| | | ob.onCompleted() |
| | | } |
| | | return Disposables.create{} |
| | | } |
| | | } |
| | | } |
| | | case 401,505,600: |
| | | if !ignoreAlert{ |
| | | alertError(msg: "登录失效,请重新登录");ob.onError(NetRequestError.InvaildSession) |
| | | } |
| | | sceneDelegate?.needLogin() |
| | | default: |
| | | //503是手机验证码错误 |
| | | if !ignoreAlert{ |
| | | DispatchQueue.main.async { |
| | | alertError(msg: "\(next.msg)") |
| | | } |
| | | } |
| | | ob.onError(NetRequestError.Other(next.code,next.msg)) |
| | | } |
| | | } |
| | | } |
| | | ob.onCompleted() |
| | | } |
| | | return Disposables.create{} |
| | | } |
| | | } |
| | | } |
| | | extension Dictionary { |
| | | mutating func append(dict: Dictionary) { |
| | | dict.forEach { (key, value) in |
| | | self.updateValue(value, forKey: key) |
| | | } |
| | | } |
| | | mutating func append(dict: Dictionary) { |
| | | dict.forEach { (key, value) in |
| | | self.updateValue(value, forKey: key) |
| | | } |
| | | } |
| | | } |
| | | |
| | | |
| | | func createError(text:String,code:Int)->AFError{ |
| | | return AFError.createURLRequestFailed(error: NSError(domain: text, code: code)) |
| | | return AFError.createURLRequestFailed(error: NSError(domain: text, code: code)) |
| | | } |