NetWorkTools.swift 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407
  1. //
  2. // NetWorkTools.swift
  3. // naiyoup
  4. //
  5. // Created by C Auto on 2021/6/2.
  6. //
  7. import Alamofire
  8. import HandyJSON
  9. import SwiftyUserDefaults
  10. public typealias Success<T> = (T) -> Void
  11. public typealias Failure = (ErrorCode) -> Void
  12. public typealias FailureMsg = (String) -> Void
  13. //MARK: - headers
  14. let networkStaticHeaderKey = "topscommToken"
  15. let Authorization = "Authorization"
  16. let token = "token"
  17. let baseurl = "https://api.ruanjian.buzz"
  18. let baseurl2 = "https://api.ruanjian1.buzz"
  19. //MARK:-网络请求类型
  20. public enum NetWorkType {
  21. case normalRequest
  22. case upload
  23. case download
  24. }
  25. //MARK:- 错误码
  26. public enum ErrorCode{
  27. //200...299
  28. case invalidResponse(String)
  29. //actionResult中的 ’success‘为false
  30. case sysError(String)
  31. case tokenError(String)
  32. //其他错误 如 ‘failure’ 返回HTTP状态码 以及 错误信息描述
  33. case networkUnavailable(String?,Int?)
  34. //重试
  35. /** @param URLRequest 失败的request
  36. * @param NetWorkType 请求类型
  37. * @param DataKey 获取数据的参数
  38. * @param String 错误信息
  39. */
  40. case needRetrier(URLRequest,NetWorkType,String)
  41. // case switchServer(String,)
  42. /**
  43. * 上传失败 回调参数
  44. * @param String 请求地址
  45. * @param [String] 参数
  46. * @param JSON 整个数据
  47. * @param [Data] 数据信息
  48. * @param [String] 数据信息描述
  49. * @param String? 错误信息
  50. */
  51. case uploadError(String,[String],[Data],[String],String?)
  52. }
  53. class NetWorkTools {
  54. static var shared = NetWorkTools()
  55. private init () {
  56. }
  57. var sessionManger: Alamofire.Session = {
  58. let config = URLSessionConfiguration.default
  59. config.timeoutIntervalForRequest = 30
  60. let manger = Alamofire.Session(configuration: config)
  61. return manger
  62. }()
  63. }
  64. extension NetWorkTools{
  65. public static func GetBaidu() {
  66. shared.sessionManger.request("https://www.baidu.com", method: .get, parameters: [:])
  67. .validate()
  68. .responseData { response in
  69. log.debug(response)
  70. }
  71. }
  72. /**
  73. * 基本请求方法
  74. * @param url 请求地址
  75. * @param param 参数
  76. * @param method post get
  77. * @param dataKey 获取的数据部分 例如 data 下面的 ‘dataList’部分
  78. * @param headers 请求头
  79. * @param isNeedReConnect 需要重连 默认true 重连3次
  80. * @param success 成功回调
  81. * @param failure 失败回调
  82. */
  83. public static func getNormalRequestWith(url: String,
  84. param: Parameters,
  85. networkType:NetWorkType,
  86. method: HTTPMethod = .post,
  87. success: @escaping Success<Any>,
  88. failure: @escaping Failure) {
  89. var headers : HTTPHeaders{
  90. if let data = Defaults[\.loginModel] {
  91. let loginM = JSONDeserializer<LoginModel>.deserializeFrom(json: data)
  92. var tap = "Bearer "
  93. if loginM?.access_token != nil {
  94. tap = tap + (loginM?.access_token)!
  95. }
  96. return ["Authorization" : tap]
  97. }
  98. return [:]
  99. }
  100. shared.sessionManger.request(baseurl + url,method: method,parameters: param,encoding: URLEncoding.default,headers: headers)
  101. .validate()
  102. .responseData { response in
  103. switch response.result{
  104. case .success:
  105. if let data = response.data {
  106. let json = String(data: data, encoding: String.Encoding.utf8)
  107. let info = JSONDeserializer<BaseModel>.deserializeFrom(json: json)
  108. if info?.ret == 1 {
  109. if let val = info?.data {
  110. success(val)
  111. } else {
  112. failure(.sysError("失败解析"))
  113. }
  114. } else {
  115. failure(.sysError(info?.msg ?? "解析失败"))
  116. }
  117. }
  118. break
  119. case .failure(let error):
  120. if let code = response.response?.statusCode {
  121. if code == 500 || code == 502 || code == 503 || code == 504{
  122. if let request = response.request {
  123. failure(.needRetrier(request, networkType, error.localizedDescription))
  124. }
  125. } else if code == 401 {
  126. //token 失效,刷新token
  127. self.getTokenRefresh(url: "/api/client/v1/refresh",param: param, networkType: networkType, method: method, success: { v in
  128. if v {
  129. self.getSwitchServer(baserurl: baseurl2, url: url, param: param, networkType: networkType, method: method, success: success, failure: failure)
  130. }else {
  131. failure(.tokenError("重新登录"))
  132. }
  133. }, failure: failure)
  134. }
  135. else {
  136. failure(.sysError(error.localizedDescription))
  137. }
  138. } else {
  139. //failure(.sysError(error.localizedDescription))
  140. self.getSwitchServer(baserurl: baseurl2, url: url, param: param, networkType: networkType, method: method, success: success, failure: failure)
  141. }
  142. break
  143. }
  144. }
  145. }
  146. //刷新token
  147. private static func getTokenRefresh(
  148. url: String,
  149. param: Parameters,
  150. networkType: NetWorkType,
  151. method: HTTPMethod = .get,
  152. success: @escaping Success<Bool>,
  153. failure: @escaping Failure
  154. ) {
  155. var headers : HTTPHeaders{
  156. if let data = Defaults[\.loginModel] {
  157. let loginM = JSONDeserializer<LoginModel>.deserializeFrom(json: data)
  158. var tap = "Bearer "
  159. if loginM?.access_token != nil {
  160. tap = tap + (loginM?.access_token)!
  161. }
  162. return ["Authorization" : tap]
  163. }
  164. return [:]
  165. }
  166. shared.sessionManger.request(baseurl2 + url, method: method, parameters: param, encoding: URLEncoding.default, headers: headers)
  167. .validate() //200...299
  168. .responseJSON{ (response) in
  169. switch response.result {
  170. case .success:
  171. if let data = response.data {
  172. //let info = Mapper<BaseModel>().map(JSONObject: data)
  173. let json = String(data: data, encoding: String.Encoding.utf8)
  174. let info = JSONDeserializer<BaseModel>.deserializeFrom(json: json)
  175. if info?.ret == 1 {
  176. if let val = info?.data {
  177. let loginModel = JSONDeserializer<LoginModel>.deserializeFrom(dict: val as? Dictionary)
  178. if let loginM = loginModel {
  179. //保存对象到序列
  180. Defaults[\.loginModel] = loginM.toJSONString() ?? ""
  181. success(true)
  182. }
  183. else{
  184. success(false)
  185. }
  186. }
  187. else {
  188. success(false)
  189. }
  190. } else {
  191. success(false)
  192. }
  193. }
  194. break
  195. case .failure(let error):
  196. if let code = response.response?.statusCode {
  197. if code == 500 || code == 502 || code == 503 || code == 504{
  198. if let request = response.request {
  199. failure(.needRetrier(request, networkType, error.localizedDescription))
  200. }
  201. }
  202. else if code == 401 {
  203. failure(.tokenError("重新登录,令牌失效"))
  204. }
  205. else {
  206. failure(.sysError(error.localizedDescription))
  207. }
  208. } else {
  209. failure(.sysError(error.localizedDescription))
  210. }
  211. break
  212. }
  213. }
  214. }
  215. //MARK:- 重试方法
  216. public static func getRetrierRequest(request:URLRequest,
  217. networkType: NetWorkType,
  218. success: @escaping Success<Any>,
  219. failure: @escaping Failure) {
  220. var headers : HTTPHeaders{
  221. if let data = Defaults[\.loginModel] {
  222. let loginM = JSONDeserializer<LoginModel>.deserializeFrom(json: data)
  223. var tap = "Bearer "
  224. if loginM?.access_token != nil {
  225. tap = tap + (loginM?.access_token)!
  226. }
  227. return ["Authorization" : tap]
  228. }
  229. return [:]
  230. }
  231. shared.sessionManger.request(request).validate().responseJSON{ (response) in
  232. if let error = response.error {
  233. failure(.invalidResponse(error.localizedDescription))
  234. }
  235. switch response.result {
  236. case .success:
  237. if let data = response.data {
  238. //let info = Mapper<BaseModel>().map(JSONObject: data)
  239. let json = String(data: data, encoding: String.Encoding.utf8)
  240. let info = JSONDeserializer<BaseModel>.deserializeFrom(json: json)
  241. if info?.ret == 1 {
  242. if let val = info?.data {
  243. success(val)
  244. }
  245. } else {
  246. //返回错误的信息
  247. failure(.sysError(info?.msg ?? ""))
  248. }
  249. }
  250. break
  251. case .failure(let error):
  252. if let code = response.response?.statusCode {
  253. if code == 500 || code == 502 || code == 503 || code == 504 {
  254. if let request = response.request {
  255. failure(.needRetrier(request, networkType, error.localizedDescription))
  256. }
  257. } else {
  258. failure(.sysError(error.localizedDescription))
  259. }
  260. } else {
  261. failure(.sysError(error.localizedDescription))
  262. }
  263. }
  264. }
  265. }
  266. public static func getSwitchServer(baserurl:String,url: String,
  267. param: Parameters,
  268. networkType:NetWorkType,
  269. method: HTTPMethod = .post,
  270. success: @escaping Success<Any>,
  271. failure: @escaping Failure) {
  272. var headers : HTTPHeaders{
  273. if let data = Defaults[\.loginModel] {
  274. let loginM = JSONDeserializer<LoginModel>.deserializeFrom(json: data)
  275. var tap = "Bearer "
  276. if loginM?.access_token != nil {
  277. tap = tap + (loginM?.access_token)!
  278. }
  279. return ["Authorization" : tap]
  280. }
  281. return [:]
  282. }
  283. shared.sessionManger.request(baserurl + url, method: method, parameters: param, encoding: URLEncoding.default, headers: headers)
  284. .validate() //200...299
  285. .responseJSON{ (response) in
  286. switch response.result {
  287. case .success:
  288. if let data = response.data {
  289. //let info = Mapper<BaseModel>().map(JSONObject: data)
  290. let json = String(data: data, encoding: String.Encoding.utf8)
  291. let info = JSONDeserializer<BaseModel>.deserializeFrom(json: json)
  292. if info?.ret == 1 {
  293. if let val = info?.data {
  294. success(val)
  295. }
  296. } else {
  297. //返回错误的信息
  298. failure(.sysError(info?.msg ?? ""))
  299. }
  300. }
  301. break
  302. case .failure(let error):
  303. if let code = response.response?.statusCode {
  304. if code == 500 || code == 502 || code == 503 || code == 504{
  305. if let request = response.request {
  306. //request.urlRequest
  307. //request.url = URL(string: "")
  308. failure(.needRetrier(request, networkType, error.localizedDescription))
  309. }
  310. } else {
  311. failure(.sysError(error.localizedDescription))
  312. }
  313. } else {
  314. failure(.sysError(error.localizedDescription))
  315. }
  316. break
  317. }
  318. }
  319. }
  320. }