HTTPServer.swift 16.9 KB
//
//  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)
            }
        }
    }
}