TSNetworkManager.swift 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. //
  2. // NetworkManager.swift
  3. // AIEmoji
  4. //
  5. // Created by 100Years on 2025/1/16.
  6. //
  7. import Alamofire
  8. import ObjectMapper
  9. let TSNetworkShared = TSNetworkManager.shared
  10. /// 网络工具类
  11. class TSNetworkManager {
  12. static let shared = TSNetworkManager()
  13. private init() {}
  14. /// 通用 Headers
  15. private var defaultHeaders: HTTPHeaders {
  16. return ["Content-Type": "application/json",
  17. "accept": "application/json",
  18. // "Authorization": "Bearer YOUR_ACCESS_TOKEN" // 按需修改
  19. ]
  20. }
  21. func postStreamRequest(
  22. urlString: String,
  23. parameters: [String: Any]? = nil,
  24. streamHandler:@escaping (String) -> Void,
  25. completion: @escaping (Result<Any, Error>) -> Void
  26. )-> DataStreamRequest? {
  27. guard let url = URL(string: urlString) else {
  28. completion(.failure(NSError(domain: "url nil", code: 0)))
  29. return nil
  30. }
  31. // 1. 创建 URLRequest
  32. var urlRequest = URLRequest(url:URL(string: urlString)!)
  33. urlRequest.httpMethod = "POST"
  34. urlRequest.setValue("application/json", forHTTPHeaderField: "Content-Type")
  35. // 2. 将字典参数转换为 JSON 数据并设置为请求体
  36. do {
  37. let jsonData = try JSONSerialization.data(withJSONObject: parameters, options: [])
  38. urlRequest.httpBody = jsonData
  39. } catch {
  40. print("Failed to encode parameters: \(error)")
  41. completion(.failure(error))
  42. return nil
  43. }
  44. // 3. 使用 AF.streamRequest 发起流式请求
  45. let request = AF.streamRequest(urlRequest)
  46. request.responseStreamString{ stream in
  47. switch stream.event {
  48. case .stream(let result):
  49. switch result {
  50. case .success(let string):
  51. debugPrint("Stream Received string: \(string)")
  52. streamHandler(string)
  53. case .failure(let error):
  54. debugPrint("Stream error: \(error)")
  55. completion(.failure(error))
  56. }
  57. case .complete(let cpl):
  58. if let error = cpl.error {
  59. debugPrint("Stream Request failed with error: \(error)")
  60. completion(.failure(error))
  61. } else {
  62. completion(.success("Stream success"))
  63. }
  64. }
  65. }
  66. return request
  67. }
  68. func request(
  69. method:HTTPMethod,
  70. urlString: String,
  71. parameters: [String: any Any & Sendable]? = nil,
  72. completion: @escaping (Result<Any, Error>) -> Void
  73. ) {
  74. dePrint("✈️✈️✈️网络请求:\(urlString)")
  75. dePrint("✈️✈️✈️参数:\(String(describing: parameters))")
  76. var encoding: ParameterEncoding = URLEncoding.default
  77. if method == .post {
  78. encoding = JSONEncoding.default
  79. }
  80. let request = AF.request(urlString, method: method, parameters: parameters, encoding: encoding, headers: defaultHeaders, interceptor: nil)
  81. request.responseString { response in
  82. self.handleResponse(response, completion: completion)
  83. }
  84. }
  85. private func handleResponse(
  86. _ response: AFDataResponse<String>,
  87. completion: @escaping (Result<Any, Error>) -> Void
  88. ) {
  89. switch response.result {
  90. case .success(let value):
  91. if let resultDict = dataToJSONObject(data:response.data) as? [String:Any] {
  92. // let code = resultDict.safeInt(forKey: "code")
  93. // if responseType != nil {
  94. // if let model = T(JSONString: value) {
  95. // handleSuccess(data: model, response: response, completion: completion)
  96. // } else {
  97. // let models = Mapper<T>().mapArray(JSONString: value)
  98. // handleSuccess(data: models ?? [], response: response, completion: completion)
  99. // }
  100. // } else {
  101. handleSuccess(data: resultDict, response: response, completion: completion)
  102. // }
  103. }else{
  104. handleFail(error: NSError(domain: "Unable to parse data", code: 0), response: response, completion: completion)
  105. }
  106. case .failure(let error):
  107. handleFail(error: error, response: response, completion: completion)
  108. }
  109. }
  110. func handleSuccess(data:Any,
  111. response: AFDataResponse<String>,
  112. completion: @escaping (Result<Any, Error>) -> Void){
  113. dePrint("🚗🚗🚗网络请求成功:\(String(describing: response.request?.url?.absoluteString))")
  114. dePrint("🚗🚗🚗网络请求成功:\(response)")
  115. completion(.success(data))
  116. }
  117. func handleFail(error:Error,
  118. response: AFDataResponse<String>,
  119. completion: @escaping (Result<Any, Error>) -> Void){
  120. dePrint("🚗🚗🚗网络请求失败:\(String(describing: response.request?.url?.absoluteString))")
  121. dePrint("🚗🚗🚗网络请求失败:\(response)")
  122. completion(.failure(error))
  123. }
  124. func dataToJSONObject(data: Data?) -> Any? {
  125. guard let data = data else { return nil }
  126. do {
  127. let jsonObject = try JSONSerialization.jsonObject(with: data, options: [])
  128. return jsonObject
  129. } catch {
  130. print("Failed to convert Data to JSON object: \(error.localizedDescription)")
  131. return nil
  132. }
  133. }
  134. }
  135. func kNetWorkResultSuccess(data:Any?) -> [String:Any]? {
  136. guard let data = data else { return nil }
  137. if let dataDict = data as? [String:Any] ,
  138. dataDict.safeInt(forKey: "code") == 200,
  139. let result = dataDict["result"] as? [String:Any]{
  140. return result
  141. }
  142. return nil
  143. }
  144. func kNetWorkMessage(data:Any?) -> String? {
  145. guard let data = data else { return nil }
  146. if let dataDict = data as? [String:Any] ,
  147. let message = dataDict["message"] as? String{
  148. return message
  149. }
  150. return nil
  151. }
  152. class JsonStringTransform<T:Mappable>: TransformType {
  153. typealias Object = T
  154. typealias JSON = [String: Any]
  155. func transformFromJSON(_ value: Any?) -> T? {
  156. if let jsonString = value as? String {
  157. let obj = T(JSONString: jsonString)
  158. return obj
  159. }
  160. if let dict = value as? [String: Any] {
  161. let obj = T(JSON: dict)
  162. return obj
  163. }
  164. return nil
  165. }
  166. func transformToJSON(_ value: T?) -> [String : Any]? {
  167. return value?.toJSON() as? [String: Any]
  168. }
  169. }