123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407 |
- //
- // NetWorkTools.swift
- // naiyoup
- //
- // Created by C Auto on 2021/6/2.
- //
- import Alamofire
- import HandyJSON
- import SwiftyUserDefaults
- public typealias Success<T> = (T) -> Void
- public typealias Failure = (ErrorCode) -> Void
- public typealias FailureMsg = (String) -> Void
- //MARK: - headers
- let networkStaticHeaderKey = "topscommToken"
- let Authorization = "Authorization"
- let token = "token"
- let baseurl = "https://api.ruanjian.buzz"
- let baseurl2 = "https://api.ruanjian1.buzz"
- //MARK:-网络请求类型
- public enum NetWorkType {
- case normalRequest
- case upload
- case download
- }
- //MARK:- 错误码
- public enum ErrorCode{
- //200...299
- case invalidResponse(String)
- //actionResult中的 ’success‘为false
- case sysError(String)
-
- case tokenError(String)
- //其他错误 如 ‘failure’ 返回HTTP状态码 以及 错误信息描述
- case networkUnavailable(String?,Int?)
- //重试
- /** @param URLRequest 失败的request
- * @param NetWorkType 请求类型
- * @param DataKey 获取数据的参数
- * @param String 错误信息
- */
- case needRetrier(URLRequest,NetWorkType,String)
-
- // case switchServer(String,)
-
- /**
- * 上传失败 回调参数
- * @param String 请求地址
- * @param [String] 参数
- * @param JSON 整个数据
- * @param [Data] 数据信息
- * @param [String] 数据信息描述
- * @param String? 错误信息
- */
- case uploadError(String,[String],[Data],[String],String?)
- }
- class NetWorkTools {
-
- static var shared = NetWorkTools()
- private init () {
-
- }
-
- var sessionManger: Alamofire.Session = {
- let config = URLSessionConfiguration.default
- config.timeoutIntervalForRequest = 30
- let manger = Alamofire.Session(configuration: config)
- return manger
- }()
- }
- extension NetWorkTools{
-
- public static func GetBaidu() {
- shared.sessionManger.request("https://www.baidu.com", method: .get, parameters: [:])
- .validate()
- .responseData { response in
- log.debug(response)
- }
- }
- /**
- * 基本请求方法
- * @param url 请求地址
- * @param param 参数
- * @param method post get
- * @param dataKey 获取的数据部分 例如 data 下面的 ‘dataList’部分
- * @param headers 请求头
- * @param isNeedReConnect 需要重连 默认true 重连3次
- * @param success 成功回调
- * @param failure 失败回调
- */
- public static func getNormalRequestWith(url: String,
- param: Parameters,
- networkType:NetWorkType,
- method: HTTPMethod = .post,
- success: @escaping Success<Any>,
- failure: @escaping Failure) {
- var headers : HTTPHeaders{
- if let data = Defaults[\.loginModel] {
- let loginM = JSONDeserializer<LoginModel>.deserializeFrom(json: data)
-
- var tap = "Bearer "
-
- if loginM?.access_token != nil {
- tap = tap + (loginM?.access_token)!
- }
- return ["Authorization" : tap]
-
- }
- return [:]
- }
-
- shared.sessionManger.request(baseurl + url,method: method,parameters: param,encoding: URLEncoding.default,headers: headers)
- .validate()
- .responseData { response in
- switch response.result{
- case .success:
- if let data = response.data {
-
- let json = String(data: data, encoding: String.Encoding.utf8)
- let info = JSONDeserializer<BaseModel>.deserializeFrom(json: json)
- if info?.ret == 1 {
- if let val = info?.data {
- success(val)
- } else {
- failure(.sysError("失败解析"))
- }
- } else {
- failure(.sysError(info?.msg ?? "解析失败"))
- }
-
- }
-
- break
- case .failure(let error):
- if let code = response.response?.statusCode {
- if code == 500 || code == 502 || code == 503 || code == 504{
- if let request = response.request {
- failure(.needRetrier(request, networkType, error.localizedDescription))
- }
- } else if code == 401 {
- //token 失效,刷新token
- self.getTokenRefresh(url: "/api/client/v1/refresh",param: param, networkType: networkType, method: method, success: { v in
-
- if v {
- self.getSwitchServer(baserurl: baseurl2, url: url, param: param, networkType: networkType, method: method, success: success, failure: failure)
- }else {
- failure(.tokenError("重新登录"))
- }
-
- }, failure: failure)
- }
- else {
- failure(.sysError(error.localizedDescription))
- }
- } else {
- //failure(.sysError(error.localizedDescription))
- self.getSwitchServer(baserurl: baseurl2, url: url, param: param, networkType: networkType, method: method, success: success, failure: failure)
-
- }
- break
- }
-
-
- }
-
- }
-
- //刷新token
- private static func getTokenRefresh(
- url: String,
- param: Parameters,
- networkType: NetWorkType,
- method: HTTPMethod = .get,
- success: @escaping Success<Bool>,
- failure: @escaping Failure
- ) {
-
- var headers : HTTPHeaders{
- if let data = Defaults[\.loginModel] {
- let loginM = JSONDeserializer<LoginModel>.deserializeFrom(json: data)
-
- var tap = "Bearer "
-
- if loginM?.access_token != nil {
- tap = tap + (loginM?.access_token)!
- }
- return ["Authorization" : tap]
-
- }
- return [:]
- }
-
-
- shared.sessionManger.request(baseurl2 + url, method: method, parameters: param, encoding: URLEncoding.default, headers: headers)
- .validate() //200...299
- .responseJSON{ (response) in
-
- switch response.result {
- case .success:
- if let data = response.data {
- //let info = Mapper<BaseModel>().map(JSONObject: data)
- let json = String(data: data, encoding: String.Encoding.utf8)
- let info = JSONDeserializer<BaseModel>.deserializeFrom(json: json)
- if info?.ret == 1 {
-
- if let val = info?.data {
- let loginModel = JSONDeserializer<LoginModel>.deserializeFrom(dict: val as? Dictionary)
-
- if let loginM = loginModel {
-
- //保存对象到序列
- Defaults[\.loginModel] = loginM.toJSONString() ?? ""
-
- success(true)
- }
- else{
- success(false)
- }
- }
- else {
- success(false)
- }
-
-
- } else {
- success(false)
- }
- }
- break
- case .failure(let error):
- if let code = response.response?.statusCode {
- if code == 500 || code == 502 || code == 503 || code == 504{
- if let request = response.request {
- failure(.needRetrier(request, networkType, error.localizedDescription))
- }
- }
- else if code == 401 {
- failure(.tokenError("重新登录,令牌失效"))
- }
- else {
- failure(.sysError(error.localizedDescription))
- }
- } else {
- failure(.sysError(error.localizedDescription))
- }
-
- break
-
- }
-
-
- }
-
- }
-
-
-
- //MARK:- 重试方法
- public static func getRetrierRequest(request:URLRequest,
- networkType: NetWorkType,
- success: @escaping Success<Any>,
- failure: @escaping Failure) {
-
- var headers : HTTPHeaders{
- if let data = Defaults[\.loginModel] {
- let loginM = JSONDeserializer<LoginModel>.deserializeFrom(json: data)
-
- var tap = "Bearer "
-
- if loginM?.access_token != nil {
- tap = tap + (loginM?.access_token)!
- }
- return ["Authorization" : tap]
-
- }
- return [:]
- }
-
- shared.sessionManger.request(request).validate().responseJSON{ (response) in
- if let error = response.error {
- failure(.invalidResponse(error.localizedDescription))
- }
-
- switch response.result {
- case .success:
- if let data = response.data {
- //let info = Mapper<BaseModel>().map(JSONObject: data)
- let json = String(data: data, encoding: String.Encoding.utf8)
- let info = JSONDeserializer<BaseModel>.deserializeFrom(json: json)
- if info?.ret == 1 {
-
- if let val = info?.data {
- success(val)
- }
-
-
- } else {
- //返回错误的信息
- failure(.sysError(info?.msg ?? ""))
- }
- }
- break
- case .failure(let error):
- if let code = response.response?.statusCode {
- if code == 500 || code == 502 || code == 503 || code == 504 {
- if let request = response.request {
- failure(.needRetrier(request, networkType, error.localizedDescription))
- }
- } else {
- failure(.sysError(error.localizedDescription))
- }
- } else {
- failure(.sysError(error.localizedDescription))
- }
- }
-
-
- }
-
- }
-
-
-
- public static func getSwitchServer(baserurl:String,url: String,
- param: Parameters,
- networkType:NetWorkType,
- method: HTTPMethod = .post,
- success: @escaping Success<Any>,
- failure: @escaping Failure) {
-
-
- var headers : HTTPHeaders{
- if let data = Defaults[\.loginModel] {
- let loginM = JSONDeserializer<LoginModel>.deserializeFrom(json: data)
-
- var tap = "Bearer "
-
- if loginM?.access_token != nil {
- tap = tap + (loginM?.access_token)!
- }
- return ["Authorization" : tap]
-
- }
- return [:]
- }
-
- shared.sessionManger.request(baserurl + url, method: method, parameters: param, encoding: URLEncoding.default, headers: headers)
- .validate() //200...299
- .responseJSON{ (response) in
-
- switch response.result {
- case .success:
- if let data = response.data {
- //let info = Mapper<BaseModel>().map(JSONObject: data)
- let json = String(data: data, encoding: String.Encoding.utf8)
- let info = JSONDeserializer<BaseModel>.deserializeFrom(json: json)
- if info?.ret == 1 {
-
- if let val = info?.data {
- success(val)
- }
-
-
- } else {
- //返回错误的信息
- failure(.sysError(info?.msg ?? ""))
- }
- }
- break
- case .failure(let error):
- if let code = response.response?.statusCode {
- if code == 500 || code == 502 || code == 503 || code == 504{
- if let request = response.request {
-
- //request.urlRequest
- //request.url = URL(string: "")
- failure(.needRetrier(request, networkType, error.localizedDescription))
- }
- } else {
- failure(.sysError(error.localizedDescription))
- }
- } else {
- failure(.sysError(error.localizedDescription))
-
- }
-
- break
-
- }
-
-
- }
- }
-
- }
|