杨锴
2025-06-04 ac84f81ca2311300b431c1bfb9f71253b59073f2
DolphinEnglishLearnStudent/Services/NetworkRequest.swift
@@ -16,24 +16,24 @@
// 假设这是服务端返回的统一定义的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{
@@ -53,227 +53,227 @@
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))
}