MOHttpManager+Common.swift 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. //
  2. // MOHttpManager+Common.swift
  3. // MiMoLive
  4. //
  5. // Created by OneeChan on 2025/9/28.
  6. //
  7. import Foundation
  8. typealias MOHttpManagerParam = [AnyHashable: Any]
  9. extension MOHttpManager {
  10. func sendGetRequest<T>(path: String, params: MOHttpManagerParam, handler: @escaping (T?, String?) -> Void) where T: Decodable {
  11. MONetAPIClient.sharedJson().requestJsonData(withPath: path, withParams: params, withMethodType: Int32(Get.rawValue)) { data, error in
  12. self.handleResponse(data: data, error: error, handler: handler)
  13. }
  14. }
  15. func sendGetRequest(path: String, params: MOHttpManagerParam, handler: @escaping (String?) -> Void) {
  16. MONetAPIClient.sharedJson().requestJsonData(withPath: path, withParams: params, withMethodType: Int32(Get.rawValue)) { data, error in
  17. self.handleResponse(data: data, error: error, handler: handler)
  18. }
  19. }
  20. func sendPostRequest<T>(path: String, params: MOHttpManagerParam, handler: @escaping (T?, String?) -> Void) where T: Decodable {
  21. MONetAPIClient.sharedJson().requestJsonData(withPath: path, withParams: params, withMethodType: Int32(Post.rawValue)) { data, error in
  22. self.handleResponse(data: data, error: error, handler: handler)
  23. }
  24. }
  25. func sendPostRequest(path: String, params: MOHttpManagerParam, handler: @escaping (String?) -> Void) {
  26. MONetAPIClient.sharedJson().requestJsonData(withPath: path, withParams: params, withMethodType: Int32(Post.rawValue)) { data, error in
  27. self.handleResponse(data: data, error: error, handler: handler)
  28. }
  29. }
  30. func sendPutRequest<T>(path: String, params: MOHttpManagerParam, handler: @escaping (T?, String?) -> Void) where T: Decodable {
  31. MONetAPIClient.sharedJson().requestJsonData(withPath: path, withParams: params, withMethodType: Int32(Put.rawValue)) { data, error in
  32. self.handleResponse(data: data, error: error, handler: handler)
  33. }
  34. }
  35. func sendPutRequest(path: String, params: MOHttpManagerParam, handler: @escaping (String?) -> Void) {
  36. MONetAPIClient.sharedJson().requestJsonData(withPath: path, withParams: params, withMethodType: Int32(Put.rawValue)) { data, error in
  37. self.handleResponse(data: data, error: error, handler: handler)
  38. }
  39. }
  40. func sendDeleteRequest<T>(path: String, params: MOHttpManagerParam, handler: @escaping (T?, String?) -> Void) where T: Decodable {
  41. MONetAPIClient.sharedJson().requestJsonData(withPath: path, withParams: params, withMethodType: Int32(Delete.rawValue)) { data, error in
  42. self.handleResponse(data: data, error: error, handler: handler)
  43. }
  44. }
  45. func sendDeleteRequest(path: String, params: MOHttpManagerParam, handler: @escaping (String?) -> Void) {
  46. MONetAPIClient.sharedJson().requestJsonData(withPath: path, withParams: params, withMethodType: Int32(Delete.rawValue)) { data, error in
  47. self.handleResponse(data: data, error: error, handler: handler)
  48. }
  49. }
  50. private func handleResponse<T>(data: [AnyHashable: Any]?, error: Error?, handler: (T?, String?) -> Void) where T: Decodable {
  51. guard let data else {
  52. handler(nil, error?.localizedDescription)
  53. return
  54. }
  55. guard self.handleError(data) else { return }
  56. if data.isCodeSuccess, let content = data.data {
  57. let res = T.decode(param: content)
  58. handler(res, nil)
  59. return
  60. }
  61. if let err = data["msg"] as? String, err != "Success" {
  62. handler(nil, err)
  63. } else {
  64. handler(nil, nil)
  65. }
  66. }
  67. private func handleResponse(data: [AnyHashable: Any]?, error: Error?, handler: (String?) -> Void) {
  68. guard let data else {
  69. handler(error?.localizedDescription)
  70. return
  71. }
  72. guard self.handleError(data) else { return }
  73. if data.isCodeSuccess {
  74. handler(nil)
  75. return
  76. }
  77. if let err = data["msg"] as? String, err != "Success" {
  78. handler(err)
  79. } else {
  80. handler(nil)
  81. }
  82. }
  83. }
  84. // Codable
  85. // TODO: 后续替换网络组件,避免需要 json -> dic -> json -> Decodable 的流程
  86. extension Decodable {
  87. static func decode(param: [AnyHashable: Any]) -> Self? {
  88. guard let jsonData = getJsonData(param) else { return nil }
  89. guard let model = try? JSONDecoder().decode(Self.self, from: jsonData) else { return nil }
  90. return model
  91. }
  92. private static func getJsonData(_ param: [AnyHashable: Any]) -> Data? {
  93. if !JSONSerialization.isValidJSONObject(param) {
  94. return nil
  95. }
  96. guard let data = try? JSONSerialization.data(withJSONObject: param, options: []) else {
  97. return nil
  98. }
  99. return data
  100. }
  101. }
  102. extension Encodable {
  103. func toDictionary() -> [AnyHashable: Any] {
  104. let coder = JSONEncoder()
  105. coder.outputFormatting = .prettyPrinted
  106. guard let data = try? coder.encode(self) else {
  107. return [:]
  108. }
  109. guard let dic = try? JSONSerialization.jsonObject(with: data, options: .mutableLeaves),
  110. let dic = dic as? [AnyHashable: Any] else {
  111. return [:]
  112. }
  113. return dic
  114. }
  115. }