// // network.swift // ParentAssistant // // Created by 葛建军 on 2018/3/6. // Copyright © 2018年 HANGZHOUTEAM. All rights reserved. // import Foundation import Alamofire import AlamofireImage //http工具 final class KHttp{ private static func http(method:HTTPMethod,url:String,parameters: [String: AnyObject]? = nil,encoding: ParameterEncoding = URLEncoding.default,headers:[String: String]?=nil,completionHandler: @escaping (String?, NSError?) -> ()){ //认证相关设置 // let manager = Manager.sharedInstance // manager.delegate.sessionDidReceiveChallenge = { session, challenge in // //认证服务器证书 // if challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust { // let serverTrust:SecTrustRef = challenge.protectionSpace.serverTrust! // let certificate = SecTrustGetCertificateAtIndex(serverTrust, 0)! // let remoteCertificateData = CFBridgingRetain(SecCertificateCopyData(certificate))! // let cerPath = NSBundle.mainBundle().pathForResource("pub",ofType: "cer")! // let localCertificateData = NSData(contentsOfFile:cerPath)! // if (remoteCertificateData.isEqualToData(localCertificateData) == true) { // let credential = NSURLCredential(forTrust: serverTrust) // challenge.sender?.useCredential(credential, // forAuthenticationChallenge: challenge) // return (NSURLSessionAuthChallengeDisposition.UseCredential, // NSURLCredential(forTrust: challenge.protectionSpace.serverTrust!)) // }else{ // return (.CancelAuthenticationChallenge, nil) // } // }else{ // return (.CancelAuthenticationChallenge, nil) // } // } let requestUrl = HOST + url request(requestUrl, method: method, parameters: parameters, encoding: encoding, headers: headers).responseString { (response) -> Void in let error=response.result.error let str=response.result.value if let er=error{ if (er as NSError).code==NSURLErrorNotConnectedToInternet{ appDelegate.window!.makeToast("网络连接不可用", duration: 1, position: CSToastPositionBottom) }else if (er as NSError).code==NSURLErrorCannotConnectToHost{ appDelegate.window!.makeToast("未能连接到服务器", duration: 1, position: CSToastPositionBottom) }else{ appDelegate.window!.makeToast("加载失败:\(er.localizedDescription)", duration: 1, position: CSToastPositionBottom) } NSLog("ERROR: url:\(requestUrl),error:\(er)") } completionHandler(str,error as NSError?) } } static func POST(url:String,parameters: [String: AnyObject]? = nil,encoding: ParameterEncoding = URLEncoding.default,headers:[String: String]?=nil,completionHandler: @escaping (String?, NSError?) -> ()){ var header:[String: String] if let hd=headers { header=hd header.updateValue(getSign(), forKey: "sign") }else{ header=["sign":getSign()] } KHttp.http(method: .post, url: url, parameters: parameters,encoding:encoding,headers:header,completionHandler:completionHandler) } static func GET(url:String,parameters: [String: AnyObject]? = nil,headers:[String: String]?=nil,completionHandler: @escaping (String?, NSError?) -> Void){ var header:[String: String] if let hd=headers { header=hd header.updateValue(getSign(), forKey: "sign") }else{ header=["sign":getSign()] } KHttp.http(method: .get, url: url, parameters: parameters,headers:header,completionHandler:completionHandler) } static func getSign()->String{ let timeFormatter=DateFormatter() timeFormatter.dateFormat="yyyy-MM-dd-HH:mm:ss:sss" let time=timeFormatter.string(from: Date())+"\(arc4random()%10000)"// let appKey="1e5b32490ad2e41ecc817849ea1310c6" let appSecret="5d744518ac1c" return (time.md5()+"/"+time.md5()+appSecret).md5().data(using: .ascii)?.base64EncodedString(options: []) ?? "" } } final class HTTPServer{ //单例 static let shared = HTTPServer() init() {} var token:String?{ return AccountManager.shared.token } //上传图片 func uploadFile(file:NSURL,progress:((Int64, Int64, Int64) -> Void)? = nil,completionHandler: @escaping (String?, NSError?) -> Void){ upload(multipartFormData: { (multipartFormData) in multipartFormData.append(file as URL, withName: "file") }, usingThreshold: SessionManager.multipartFormDataEncodingMemoryThreshold, to: URL_UPLOAD_FILE, method: .post, headers: nil) { (encodingResult) in switch encodingResult { case .success(let upload, _, _): upload.responseString(completionHandler: { (response) in completionHandler(response.result.value,response.result.error as NSError?) }) case .failure(let encodingError): completionHandler(nil,encodingError as NSError?) } } } //MARK:-User个人信息有关 //登录 func login(completionHandler:@escaping (String?, NSError?) -> (),phone:String, password:String){ let timeFormatter=DateFormatter() timeFormatter.dateFormat="yyyy-MM-dd-HH:mm:ss:sss" let time=timeFormatter.string(from: Date())+"\(arc4random()%10000)" let appSecret="5d744518ac1c" let authorization=(time.md5()+":"+(time.md5()+appSecret).md5()).data(using: String.Encoding.ascii)?.base64EncodedString(options: Data.Base64EncodingOptions(rawValue: 0)) ?? "" KHttp.POST(url: URL_OAUTH_TOKEN,parameters: ["grant_type":"password" as AnyObject,"username":phone as AnyObject,"password":password as AnyObject], encoding: URLEncoding.default,headers:["Authorization":"Basic "+authorization], completionHandler: completionHandler) } //更新token func refreshToken(completionHandler:@escaping (String?, NSError?) -> Void,token refresh_token:String){ let timeFormatter=DateFormatter() timeFormatter.dateFormat="yyyy-MM-dd-HH:mm:ss:sss" let time=timeFormatter.string(from: Date())+"\(arc4random()%10000)" let appSecret="5d744518ac1c" let authorization=(time.md5()+":"+(time.md5()+appSecret).md5()).data(using: String.Encoding.ascii)?.base64EncodedString(options: Data.Base64EncodingOptions(rawValue: 0)) ?? "" KHttp.POST(url: URL_OAUTH_TOKEN, parameters:["grant_type":"refresh_token" as AnyObject,"refresh_token":refresh_token as AnyObject], headers:["Authorization":"Basic "+authorization],completionHandler: completionHandler) } //获取开屏广告URL func getOpenAds(completionHandler:@escaping (String?, NSError?) -> ()){ KHttp.GET(url: URL_GETOPENADS,headers:["Authorization":token!], completionHandler: completionHandler) } //我的课程提醒 func getMyLiveRemind(completionHandler:@escaping (String?, NSError?) -> ()){ KHttp.GET(url: URL_USER_MYLIVEREMIND, headers:["Authorization":token!], completionHandler: completionHandler) } //更新本地个人信息 func uplocalUserInfo(completionHandler:@escaping (String?, NSError?) -> ()){ KHttp.GET(url: URL_USER_USERINFO, headers:["Authorization":token!], completionHandler: completionHandler) } //修改密码 func updatePassword(parameters: [String : AnyObject]?,completionHandler:@escaping (String?, NSError?) -> ()){ KHttp.POST(url: URL_USER_UPDATEPASSWORD, parameters: parameters,headers:["Authorization":token!], completionHandler: completionHandler) } //家长注册 func parentRegister(parameters: [String : AnyObject]?,completionHandler:@escaping (String?, NSError?) -> ()){ KHttp.POST(url: URL_PARENTREGISTER, parameters: parameters,headers:["Authorization":token!], completionHandler: completionHandler) } //获取注册验证码 func getCaptcha(_ mobile:String,completionHandler:@escaping (String?, NSError?) -> Void){ KHttp.GET(url: URL_CAPTCHA,parameters:["mobile":mobile as AnyObject],headers:["Authorization":token!], completionHandler: completionHandler) } //找回密码 func resetPassWord(_ mobile:String,pw:String?=nil,code:String,completionHandler:@escaping (String?, NSError?) -> Void){ var p:[String:String]! if let pass=pw{ p=["captcha":code,"Mobile":mobile,"pass":pass] }else{ p=["captcha":code,"Mobile":mobile,"pass":"Empty"] } //,headers:["Authorization":anonymousToken ?? ""] KHttp.GET(url: URL_RESTPW,parameters:p! as [String : AnyObject], completionHandler: completionHandler) } //登录获取家长信息(包括关联的孩子信息区分绑定状态 func getParentInfo(_ parameters:[String:AnyObject],completionHandler:@escaping (String?, NSError?) -> ()){ KHttp.POST(url: URL_GETPARENTINFO,parameters:parameters, headers:["Authorization":token!], completionHandler: completionHandler) } //更新姓名和性别 func updateParentInfo(parameters: [String : AnyObject]?,completionHandler:@escaping (String?, NSError?) -> ()){ KHttp.POST(url: URL_UPDATEPARENTINFO, parameters: parameters,headers:["Authorization":token!], completionHandler: completionHandler) } //获取我的短信包列表 func getOrderList(_ parameters:[String:AnyObject],completionHandler:@escaping (String?, NSError?) -> ()){ KHttp.GET(url: URL_GETORDERLIST,parameters:parameters,headers:["Authorization":token!], completionHandler: completionHandler) } //解绑孩子 func getUnBindStudent(_ parameters:[String:AnyObject],completionHandler:@escaping (String?, NSError?) -> ()){ KHttp.GET(url: URL_UNBINDSTUDENT,parameters:parameters,headers:["Authorization":token!], completionHandler: completionHandler) } //根据选择的市获取该地区的学校或者根据关键字搜索学校 func getAreaSchool(parameters: [String : AnyObject]?,completionHandler:@escaping (String?, NSError?) -> ()){ // var urlStr = URL_GETAREASCHOOL+"?AreaName=\(getPercentEncodingString(str: parameters["AreaName"]! as! String))" // if let str = parameters["Keyword"]{ // urlStr = urlStr + "&Keyword=\(getPercentEncodingString(str: str as! String))" // } KHttp.POST(url: URL_GETAREASCHOOL, parameters: parameters,headers:["Authorization":token!], completionHandler: completionHandler) } //获取该学校的年级或班级 func getClassOrGrade(_ parameters:[String:AnyObject],completionHandler:@escaping (String?, NSError?) -> ()){ KHttp.GET(url: URL_GETCLASSORGRADE,parameters:parameters,headers:["Authorization":token!], completionHandler: completionHandler) } //MARK: ---- ParentService ----- //获取工具入口和活动 func getActivityTool(_ parameters:[String:AnyObject],completionHandler:@escaping (String?, NSError?) -> ()){ KHttp.GET(url: URL_PARENTSERVICE_GETACTIVITYTOOL,parameters:parameters,headers:["Authorization":token!], completionHandler: completionHandler) } //绑定孩子信息(合作学校绑定返回null,非合作学校返回“汇作业”账号和密码) func bindlingChildren(parameters: [String : AnyObject],completionHandler:@escaping (String?, NSError?) -> ()){ KHttp.POST(url: URL_BINDLINGCHILDREN, parameters: parameters,headers:["Authorization":token!], completionHandler: completionHandler) } //获取频道资讯 func getChannelInfo(_ parameters:[String:AnyObject],completionHandler:@escaping (String?, NSError?) -> ()){ KHttp.POST(url: URL_PARENTSERVICE_GETCHANNELINFO,parameters:parameters,headers:["Authorization":token!], completionHandler: completionHandler) } //获取首页资讯话题/搜索资讯 func getInformationTopic(_ parameters:[String:AnyObject],completionHandler:@escaping (String?, NSError?) -> ()){ KHttp.POST(url: URL_PARENTSERVICE_GETINFORMATIONTOPIC,parameters:parameters,headers:["Authorization":token!], completionHandler: completionHandler) } //获取订购的报告或科目 func getOrderSubject(_ parameters:[String:AnyObject],completionHandler:@escaping (String?, NSError?) -> ()){ KHttp.GET(url: URL_PARENTSERVICE_GETORDERSUBJECT,parameters:parameters,headers:["Authorization":token!], completionHandler: completionHandler) } //获取报告列表 func workReport(parameters: [String : AnyObject]?,completionHandler:@escaping (String?, NSError?) -> ()){ KHttp.POST(url: URL_PARENTSERVICE_WORKREPORT, parameters: parameters,headers:["Authorization":token!], completionHandler: completionHandler) } //MARK: - 成长 //MARK: 应用 ///补卡 func postStudentMendCard(parameters: [String : AnyObject]?,completionHandler:@escaping (String?, NSError?) -> ()){ KHttp.POST(url: URL_POST_MEND_CARD, parameters: parameters,headers:["Authorization":token!], completionHandler: completionHandler) } ///考勤 func getStudentCheckList(parameters: [String : AnyObject]?,completionHandler:@escaping (String?, NSError?) -> ()){ KHttp.GET(url: URL_GET_ATTENDANCE_LIST, parameters: parameters,headers:["Authorization":token!], completionHandler: completionHandler) } //MARK:量规评价 //获取报告详情 func workReportDetails(parameters: [String : AnyObject]?,completionHandler:@escaping (String?, NSError?) -> ()){ KHttp.POST(url: URL_PARENTSERVICE_WORKREPORTDETAILS, parameters: parameters,headers:["Authorization":token!], completionHandler: completionHandler) } //获取德育报告-总体详情 func getEvaluationSceneAnalysis(parameters:[String:AnyObject]?,completionHandler:@escaping (String?,NSError?)->()){ KHttp.POST(url: URL_POST_EVALUATION_ANALYSIS, parameters: parameters, headers: ["Authorization":token!], completionHandler: completionHandler) } //获取德育报告-场景详情 func getEvaluationSceneAnalysisDetails(parameters:[String:AnyObject]?,completionHandler:@escaping (String?,NSError?)->()){ KHttp.POST(url: URL_POST_EVALUATION_ANALYSIS_DETAILS, parameters: parameters, headers: ["Authorization":token!], completionHandler: completionHandler) } //订购信息 func orderCenter(parameters: [String : AnyObject]?,completionHandler:@escaping (String?, NSError?) -> ()){ KHttp.POST(url: URL_PARENTSERVICE_ORDERCENTER, parameters: parameters,headers:["Authorization":token!], completionHandler: completionHandler) } //查看订购详情 func orderServiceDetails(_ parameters:[String:AnyObject],completionHandler:@escaping (String?, NSError?) -> ()){ KHttp.GET(url: URL_PARENTSERVICE_ORDERSERVICEDETAILS,parameters:parameters,headers:["Authorization":token!], completionHandler: completionHandler) } //获取广告位信息 func getAds(_ parameters:[String:AnyObject],completionHandler:@escaping (String?, NSError?) -> ()){ KHttp.GET(url: URL_PARENTSERVICE_GETADS,parameters:parameters,headers:["Authorization":token!], completionHandler: completionHandler) } } let SERVER_MESSAGE=393939 func httpJsonResule(jsonString:String?,error:NSError?,successHandler:(JSON)->Void,failHandler:(NSError)->Void){ let json=JSON.fromString(jsonString) if let info=json{ if info.isSuccess(){ successHandler(info) }else{ failHandler(NSError(domain: "shunzhi.net", code: SERVER_MESSAGE, userInfo: [NSLocalizedDescriptionKey:info["message"].stringValue])) } }else{ if let e=error{ failHandler(e) }else{ failHandler(NSError(domain: "shunzhi.net", code: 0, userInfo: [NSLocalizedDescriptionKey:"not a json!!"])) } } } // MARK: - 对UIImageView的网络加载图片扩展 extension UIImageView { /// 网络加载图片 /// /// - Parameters: /// - urlStr: 图片网络地址字符串 /// - placeholder: 默认替代图片 func setImageWithUrl(urlStr:String,placeholder:String?) { if !(urlStr.isEmpty){ let imageUrl = URL.init(string: urlStr) if placeholder == nil { self.af_setImage(withURL: imageUrl!) }else{ self.af_setImage(withURL: imageUrl!, placeholderImage: UIImage.init(named: placeholder!)) } }else{ if let image = placeholder { self.image = UIImage.init(named: image) } } } }