network.swift 14.5 KB
//
//  network.swift
//  XSTLive
//
//  Created by 葛建军 on 16/11/10.
//  Copyright © 2016年 HANGZHOUTEAM. All rights reserved.
//

import Foundation
extension JSON{
    func isSuccess()->Bool{
        return self["status"].intValue==1
    }
    func contentData()->JSON{
        return self["data"]
    }
    
    static func fromString(jsonString:String?)->JSON?{
        if let dataFromString = jsonString?.data(using: String.Encoding.utf8, allowLossyConversion: false) {
            let json = JSON(data: dataFromString)
            return json
        }
        return nil
    }
}
//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)
//            }
//        }
        request(url, 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{
                AppDelegate.instance().window?.makeToast("加载失败:\(er.localizedDescription)", duration: 1, position: CSToastPositionBottom)
            }
            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 HOST="http://60.190.202.49:8096/swagger/ui/index#"//"https://zbapi.myjxt.com"//"http://60.190.202.49:8096/swagger/ui/index#"

    static let URL_OAUTH_TOKEN=HOST+"/OAuth/Token"                          //登录
    
    static let URL_ACCOUNTPHONECAPTCHA=HOST+"/api/Account/PhoneCaptcha"     //获取验证码
    static let URL_ACCOUNTCREATEUSER=HOST+"/api/Account/CreateUser"         //游客注册
    static let URL_ACCOUNTUPDATEPASSWORD=HOST+"/api/Account/UpdatePassword" //重设密码
    static let URL_ACCOUNTCURRENTINFO=HOST+"/api/Account/CurrentInfo"       //获取当前登陆用户的信息
    static let URL_ACCOUNTACTIVATEACCOUNT=HOST+"/api/Account/ActivateAccount"//激活账号
    static let URL_ACCOUNTUPDATEUSER=HOST+"/api/Account/Updateuser"          //修改用户信息
    static let URL_ACCOUNTADDUSER=HOST+"/api/Account/AddUser"                //
    
    static let URL_COMMONGETCOURSEWAREVERSIONS=HOST+"/api/Common/GetCourseWareVersions"     //获取所有的教材版本
    static let URL_COMMONGETSUBJECTS=HOST+"/api/Common/GetSubjects"                         //获取学科
    static let URL_COMMONGETSCHOOLTYPES=HOST+"/api/Common/GetSchoolTypes"                   //获取学段
    static let URL_COMMONGETLUNBOLIST=HOST+"/api/Common/GetLunboList"                       //获取轮播图
    static let URL_COMMONGETGRADES=HOST+"/api/Common/GetGrades"                             //根据学段获取年级
    static let URL_COMMONGETCOURSEWAVES=HOST+"/api/Common/GetCourseWaves"                   //获取教材
    static let URL_UPLOAD_FILE=HOST+"/api/Common/UploadFile"                //文件上传接口,接受图片(gif,jpg,jpeg,png,bmp)、视频(flv,mp4)、音频(mp3,aac)
    
    static let URL_COURSEGETHOTRESCOURSE=HOST+"/api/Course/GetHotRescourse"                 //获取热门微课/课件/电视台节目
    static let URL_COMMONGETSUBJECTS=HOST+"/api/Course/GetResourceCount"                         //获取微课/课件/电视台节目的总数量
    static let URL_COMMONGETSCHOOLTYPES=HOST+"/api/Course/GetTopTenSchool"                   //获取十佳校园电视台
    static let URL_COMMONGETLUNBOLIST=HOST+"/api/Course/GetExcellentSchool"                       //获取优秀电视台
    static let URL_COMMONGETGRADES=HOST+"/api/Course/GetExcellentProgram"                             //获取校园电视节目
    static let URL_COMMONGETCOURSEWAVES=HOST+"/api/Course/GetResourceModel"                   //获取单个课程
    static let URL_UPLOAD_FILE=HOST+"/api/Course/GetResourceList"                //根据知识点/教材等各种条件来分页获取资源/课件
    static let URL_COMMONGETLUNBOLIST=HOST+"/api/Course/GetWaveCatagory"                       //获取教材目录(已初始化成ztree所要求的格式)
    static let URL_COMMONGETGRADES=HOST+"/api/Course/GetTopicCatagory"                             //获取知识点目录(已初始化成ztree所要求的格式)
    static let URL_COMMONGETCOURSEWAVES=HOST+"/api/Course/GetTestCatagory"                   //获取考点目录(已初始化成ztree所要求的格式)
    static let URL_UPLOAD_FILE=HOST+"/api/Course/GetTelevisionStationCatagory"                //获取电视台目录
    
    
    var token:String?{
        return accountManager.token
    }
    var accountManager:AccountManager!
    //上传图片
    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: HTTPServer.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:-Account个人信息有关
    //登录
    func login(parameters: [String : AnyObject]?,completionHandler:@escaping (String?, NSError?) -> ()){
        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: HTTPServer.URL_OAUTH_TOKEN, parameters: parameters,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: HTTPServer.URL_OAUTH_TOKEN, parameters:["grant_type":"refresh_token" as AnyObject,"refresh_token":refresh_token as AnyObject], headers:["Authorization":"Basic "+authorization],completionHandler: completionHandler)
    }
    //获取验证码
    func getChangePhoneCaptcha(mobile:String,completionHandler:@escaping (String?, NSError?) -> Void){
        KHttp.GET(url: HTTPServer.URL_ACCOUNTPHONECAPTCHA,parameters:["mobile":mobile as AnyObject],headers:["Authorization":token!], completionHandler: completionHandler)
    }
    //游客注册
    func getCreateUser(parameters: [String : AnyObject]?,completionHandler:@escaping (String?, NSError?) -> ()){
        KHttp.POST(url: HTTPServer.URL_ACCOUNTCREATEUSER, parameters: parameters,headers:["Authorization":token!], completionHandler: completionHandler)
    }
    //重设密码
    func getUpdatePassword(parameters: [String : AnyObject]?,completionHandler:@escaping (String?, NSError?) -> ()){
        KHttp.GET(url: HTTPServer.URL_ACCOUNTUPDATEPASSWORD, parameters: parameters,headers:["Authorization":token!], completionHandler: completionHandler)
    }
    //获取当前登陆用户的信息
    func getCurrentInfo(parameters: [String : AnyObject]?,completionHandler:@escaping (String?, NSError?) -> ()){
        KHttp.GET(url: HTTPServer.URL_ACCOUNTCURRENTINFO, parameters: parameters,headers:["Authorization":token!], completionHandler: completionHandler)
    }
    //激活账号
    func postActivateAccount(parameters: [String : AnyObject]?,completionHandler:@escaping (String?, NSError?) -> ()){
        KHttp.POST(url: HTTPServer.URL_ACCOUNTACTIVATEACCOUNT, parameters: parameters,headers:["Authorization":token!], completionHandler: completionHandler)
    }
    //修改用户信息
    func postUpdateUser(parameters: [String : AnyObject]?,completionHandler:@escaping (String?, NSError?) -> ()){
        KHttp.POST(url: HTTPServer.URL_ACCOUNTUPDATEUSER, parameters: parameters,headers:["Authorization":token!], completionHandler: completionHandler)
    }
    
    //
    func getAddUser(parameters: [String : AnyObject]?,completionHandler:@escaping (String?, NSError?) -> ()){
        KHttp.GET(url: HTTPServer.URL_ACCOUNTADDUSER, parameters: parameters,headers:["Authorization":token!], completionHandler: completionHandler)
    }
    //MARK:-Common
    //获取所有的教材版本
    func getCourseWareVersions(parameters: [String : AnyObject]?,completionHandler:@escaping (String?, NSError?) -> ()){
        KHttp.GET(url: HTTPServer.URL_COMMONGETCOURSEWAREVERSIONS, parameters: parameters,headers:["Authorization":token!], completionHandler: completionHandler)
    }
    //获取学科
    func getSubjects(parameters: [String : AnyObject]?,completionHandler:@escaping (String?, NSError?) -> ()){
        KHttp.GET(url: HTTPServer.URL_COMMONGETSUBJECTS, parameters: parameters,headers:["Authorization":token!], completionHandler: completionHandler)
    }
    //获取学段
    func getSchoolTypes(parameters: [String : AnyObject]?,completionHandler:@escaping (String?, NSError?) -> ()){
        KHttp.GET(url: HTTPServer.URL_COMMONGETSCHOOLTYPES, parameters: parameters,headers:["Authorization":token!], completionHandler: completionHandler)
    }
    //获取轮播图 type:0-视频云前端轮播图 1-校园电视台轮播图
    func getLunboList(parameters: [String : AnyObject]?,completionHandler:@escaping (String?, NSError?) -> ()){
        KHttp.GET(url: HTTPServer.URL_COMMONGETLUNBOLIST, parameters: parameters,headers:["Authorization":token!], completionHandler: completionHandler)
    }
    //根据学段获取年级
    func getGrades(parameters: [String : AnyObject]?,completionHandler:@escaping (String?, NSError?) -> ()){
        KHttp.GET(url: HTTPServer.URL_COMMONGETGRADES, parameters: parameters,headers:["Authorization":token!], completionHandler: completionHandler)
    }
    //获取教材
    func getCourseWaves(parameters: [String : AnyObject]?,completionHandler:@escaping (String?, NSError?) -> ()){
        KHttp.GET(url: HTTPServer.URL_COMMONGETCOURSEWAVES, parameters: parameters,headers:["Authorization":token!], completionHandler: completionHandler)
    }
    //MARK:-Course
    //MARK:-DataStatistics
    //MARK:-UserCenter
    

}
let SERVER_MESSAGE=393939
func httpJsonResule(jsonString:String?,error:NSError?,successHandler:(JSON)->Void,failHandler:(NSError)->Void){
    let json=JSON.fromString(jsonString: 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!!"]))
        }
    }
}