SWNetRequest.swift 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. //
  2. // SWNetRequest.swift
  3. // LiteraryHeaven
  4. //
  5. // Created by SanW on 2017/8/2.
  6. // Copyright © 2017年 ONON. All rights reserved.
  7. //
  8. import Alamofire
  9. import UIKit
  10. // 默认超时时间
  11. public let timeoutInterval: TimeInterval = 30
  12. // MARK: - 错误
  13. /// 错误
  14. public struct PQError: Error {
  15. public var msg: String? // 提示信息
  16. public var code: Int // 错误吗
  17. public init(msg: String?, code: Int = 0) {
  18. self.msg = msg
  19. self.code = code
  20. }
  21. public var localizedDescription: String {
  22. return msg ?? ""
  23. }
  24. }
  25. // MARK: - 网络请求
  26. /// 网络请求
  27. public class SWNetRequest: NSObject {
  28. static let sessionManager: Alamofire.SessionManager = {
  29. let configuration = URLSessionConfiguration.default
  30. configuration.timeoutIntervalForRequest = timeoutInterval
  31. return Alamofire.SessionManager(configuration: configuration)
  32. }()
  33. static let reTrySessionManager: Alamofire.SessionManager = {
  34. let configuration = URLSessionConfiguration.default
  35. configuration.timeoutIntervalForRequest = 5
  36. return Alamofire.SessionManager(configuration: configuration)
  37. }()
  38. /// 回调方法
  39. public typealias completeHander = (_ responseobject: Any?, _ extData: [String: Any]?, _ error: PQError?, _ timeline: Timeline) -> Void
  40. /// get请求
  41. public class func getRequestData(url: String, parames: [String: Any]?, encoding: ParameterEncoding = URLEncoding.default, timeoutInterval: TimeInterval = timeoutInterval, response: @escaping completeHander) {
  42. requestData(method: .get, encoding: encoding, url: url, parames: parames, timeoutInterval: timeoutInterval) { responseObject, extData, error, timeline in
  43. response(responseObject, extData, error, timeline)
  44. }
  45. }
  46. /// post请求
  47. public class func postRequestData(url: String, parames: [String: Any]?, encoding: ParameterEncoding = URLEncoding.default, timeoutInterval: TimeInterval = timeoutInterval, response: @escaping completeHander) {
  48. requestData(method: .post, encoding: encoding, url: url, parames: parames, timeoutInterval: timeoutInterval) { responseObject, extData, error, timeline in
  49. response(responseObject, extData, error, timeline)
  50. }
  51. }
  52. /// 发送head请求
  53. /// - Parameter url: <#url description#>
  54. /// - Returns: <#description#>
  55. class public func headRequestData(url: String, completionHandler: @escaping (Data?, URLResponse?, Error?) -> Void) {
  56. BFLog(message: "发起head请求 = \(url)")
  57. if !isValidURL(url: url) {
  58. completionHandler(nil, nil, PQError(msg: "url错误", code: 1001))
  59. return
  60. }
  61. // http://www.mxfjx.com/uploadfiles/2014/4/小鸡%20鸡蛋%20蛋生鸡%20鸡生蛋_conew1.gif
  62. url.urlEncoded()
  63. let reqUrl = URL(string: url)!
  64. var request = URLRequest(url: reqUrl)
  65. request.timeoutInterval = 1 // 设置超时1s
  66. request.httpMethod = "HEAD"
  67. let session = URLSession.shared
  68. let headTask = session.dataTask(with: request) { data, response, error in
  69. completionHandler(data, response, error)
  70. BFLog(message: "head请求返回 = \(url),code = \((response as? HTTPURLResponse)?.statusCode ?? 0),response = \(String(describing: response))")
  71. }
  72. headTask.resume()
  73. }
  74. /// put请求
  75. public class func putRequestData(url: String, parames: [String: Any]?, encoding: ParameterEncoding = URLEncoding.default, timeoutInterval: TimeInterval = timeoutInterval, response: @escaping completeHander) {
  76. requestData(method: .put, encoding: encoding, url: url, parames: parames, timeoutInterval: timeoutInterval) { responseObject, extData, error, timeline in
  77. response(responseObject, extData, error, timeline)
  78. }
  79. }
  80. /// delete请求
  81. public class func deleteRequestData(url: String, parames: [String: Any]?, encoding: ParameterEncoding = URLEncoding.default, timeoutInterval: TimeInterval = timeoutInterval, response: @escaping completeHander) {
  82. requestData(method: .delete, encoding: encoding, url: url, parames: parames, timeoutInterval: timeoutInterval) { responseObject, extData, error, timeline in
  83. response(responseObject, extData, error, timeline)
  84. }
  85. }
  86. /// 网络请求
  87. fileprivate class func requestData(method: HTTPMethod, encoding: ParameterEncoding, url: String, parames: [String: Any]?, timeoutInterval _: TimeInterval = timeoutInterval, response: @escaping completeHander) {
  88. var requestParams: [String: Any] = Dictionary<String, Any>.init()
  89. if encoding is JSONEncoding {
  90. requestParams["baseInfo"] = commonParams()
  91. requestParams["params"] = parames
  92. } else {
  93. requestParams = commonParams()
  94. if parames != nil, parames?.count ?? 0 > 0 {
  95. if parames?.keys.contains("abInfoData") ?? false, "\(parames?["abInfoData"] ?? "")".count > 0, "\(parames?["abInfoData"] ?? "")" != "{}" {
  96. requestParams.removeValue(forKey: "abInfoData")
  97. }
  98. for (key, value) in parames!.reversed() {
  99. requestParams[key] = value
  100. }
  101. }
  102. }
  103. BFLog(message: "发起请求:\(url),params:\(requestParams)")
  104. (timeoutInterval <= 5 ? reTrySessionManager : sessionManager).request(url, method: method, parameters: requestParams, encoding: encoding, headers: nil).responseJSON { jsonResponse in
  105. BFLog(message: "jsonResponse = \(jsonResponse.timeline)")
  106. /// 返回值
  107. if jsonResponse.result.isSuccess {
  108. let respondDict: [String: Any] = try! JSONSerialization.jsonObject(with: jsonResponse.data!, options: JSONSerialization.ReadingOptions.mutableContainers) as! [String: Any]
  109. BFLog(message: "请求成功:\(url),respond:\(respondDict)")
  110. if respondDict.keys.contains("code") && "\(respondDict["code"] ?? "")" == "0" && respondDict.keys.contains("data") {
  111. let extData = respondDict["extData"] as? [String: Any]
  112. if extData != nil && (extData?.keys.contains("abInfoData") ?? false) {
  113. // PQSingletoMemoryUtil.shared.parasABinfoData(abInfo: extData?["abInfoData"] as? String)
  114. }
  115. response(respondDict["data"], extData, nil, jsonResponse.timeline)
  116. } else if (respondDict.keys.contains("msg") && "\(respondDict["msg"] ?? "")".count > 0) || (respondDict.keys.contains("message") && "\(respondDict["message"] ?? "")".count > 0) {
  117. response(respondDict["data"], nil, PQError(msg: "\(respondDict["msg"] ?? "")", code: Int("\(respondDict["code"] ?? "")") ?? 10001), jsonResponse.timeline)
  118. } else {
  119. response(nil, nil, PQError(msg: jsonResponse.result.error?.localizedDescription, code: 10001), jsonResponse.timeline)
  120. }
  121. } else {
  122. BFLog(message: "请求失败:\(url),error:\(jsonResponse.result.error?.localizedDescription ?? "")")
  123. let code: Int? = (jsonResponse.result.error as NSError?)?.code
  124. response(nil, nil, PQError(msg: (code == -1009 || code == -1001) ? "网络不可用" : jsonResponse.result.error?.localizedDescription, code: code ?? 10001), jsonResponse.timeline)
  125. }
  126. }
  127. }
  128. /// 取消网络请求
  129. /// - Parameter url: 某一个地址,空则取消所有
  130. /// - Returns: <#description#>
  131. public class func cancelTask(url: String?) {
  132. sessionManager.session.getAllTasks(completionHandler: { tasks in
  133. tasks.forEach { task in
  134. if task.currentRequest?.url?.absoluteString == url {
  135. task.cancel()
  136. }
  137. }
  138. })
  139. }
  140. }