KMHTTP.swift 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. //
  2. // KMHTTP.swift
  3. // PDF Reader Pro
  4. //
  5. // Created by User-Tangchao on 2024/10/23.
  6. //
  7. import Cocoa
  8. public class KMRequestResultModel: NSObject {
  9. public var code: Int = 0
  10. public var msg: String?
  11. public var data: Any?
  12. convenience init(dict: [String : Any]) {
  13. self.init()
  14. self.code = dict["code"] as? Int ?? 0
  15. self.msg = dict["msg"] as? String
  16. self.data = dict["data"]
  17. }
  18. public func isSuccess() -> Bool {
  19. return self.code == 200
  20. }
  21. }
  22. class KMHTTP: NSObject {
  23. private static let baseUrl = "https://api-server.compdf.com/server/"
  24. private static let boundary = "kBoundary"
  25. // MARK: - Base
  26. public class func GET(urlString: String, parameter: [String : String]? = nil, headers: [String : String]? = nil, callback:@escaping ((Bool, [String : Any]?, String?)->Void)) {
  27. var _urlString = "\(self.baseUrl)"+urlString
  28. if let data = parameter, !data.isEmpty {
  29. _urlString.append("?")
  30. var i = 0
  31. for (key, value) in data {
  32. _urlString.append("\(key)=\(value)")
  33. if (data.count > 1 && i != data.count-1) {
  34. _urlString.append("&")
  35. }
  36. i += 1
  37. }
  38. }
  39. let url: URL = URL(string: _urlString)!
  40. let session = URLSession.shared
  41. var request = URLRequest(url: url)
  42. request.httpMethod = "GET"
  43. request.setValue("application/json; charset=UTF-8", forHTTPHeaderField: "Content-Type")
  44. if let _headers = headers {
  45. for (key, value) in _headers {
  46. request.setValue(value, forHTTPHeaderField: key)
  47. }
  48. }
  49. request.timeoutInterval = 60.0
  50. session.configuration.timeoutIntervalForRequest = 30.0
  51. let task: URLSessionDataTask = session.dataTask(with: request) { data , response, error in
  52. DispatchQueue.main.async {
  53. if let _ = error {
  54. callback(false, nil, error.debugDescription)
  55. return
  56. }
  57. guard let _data = data else {
  58. callback(false, nil, error.debugDescription)
  59. return
  60. }
  61. if let result = self.JsonDataParse(data: _data) {
  62. let resultMap = KMRequestResultModel(dict: result)
  63. var dataDict: [String : Any] = [:]
  64. if let data = resultMap.data as? [String : Any] {
  65. dataDict = data
  66. } else {
  67. if let dataArray = resultMap.data as? [Any] {
  68. var i = 0
  69. for dict in dataArray {
  70. dataDict["\(i)"] = dict
  71. i += 1
  72. }
  73. }
  74. }
  75. callback(resultMap.isSuccess(), dataDict, error.debugDescription)
  76. return
  77. }
  78. callback(false, nil, error.debugDescription)
  79. }
  80. }
  81. task.resume()
  82. }
  83. public class func POST(urlString: String, parameter: [String : Any]?, headers: [String : String]?, callback:@escaping ((Bool, KMRequestResultModel? , String?)->Void)) {
  84. let url: URL = URL(string: urlString)!
  85. let session = URLSession.shared
  86. var request = URLRequest(url: url)
  87. request.httpMethod = "POST"
  88. request.setValue("application/json; charset=UTF-8", forHTTPHeaderField: "Content-Type")
  89. request.setValue("application/json; charset=UTF-8", forHTTPHeaderField: "Accept")
  90. if let _headers = headers {
  91. for (key, value) in _headers {
  92. if let con = request.allHTTPHeaderFields?.keys.contains(key), con {
  93. request.addValue(value, forHTTPHeaderField: key)
  94. } else {
  95. request.setValue(value, forHTTPHeaderField: key)
  96. }
  97. }
  98. }
  99. request.timeoutInterval = 60.0
  100. session.configuration.timeoutIntervalForRequest = 30.0
  101. if let data = parameter {
  102. let body = try?JSONSerialization.data(withJSONObject: data, options: [])
  103. request.httpBody = body
  104. }
  105. let task: URLSessionDataTask = session.dataTask(with: request) { data , response, error in
  106. DispatchQueue.main.async {
  107. if let _ = error {
  108. callback(false, nil, error.debugDescription)
  109. return
  110. }
  111. guard let _data = data else {
  112. callback(false, nil, error.debugDescription)
  113. return
  114. }
  115. if let result = self.JsonDataParse(data: _data) {
  116. let resultMap = KMRequestResultModel(dict: result)
  117. callback(resultMap.isSuccess(), resultMap, error.debugDescription)
  118. return
  119. }
  120. //
  121. callback(false, nil, error.debugDescription)
  122. }
  123. }
  124. task.resume()
  125. }
  126. public class func UploadFile(urlString: String, parameter: [String : Any]? = nil, headers: [String : String]? = nil, filepath: String, callback:@escaping ((Bool, [String : Any]?, String?)->Void)) {
  127. let url = URL(string: self.baseUrl + urlString)
  128. var request = URLRequest(url: url!)
  129. request.httpMethod = "POST"
  130. if let _headers = headers {
  131. for (key, value) in _headers {
  132. request.setValue(value, forHTTPHeaderField: key)
  133. }
  134. }
  135. request.setValue("multipart/form-data; boundary=\(self.boundary)", forHTTPHeaderField: "Content-Type")
  136. var bodyString = ""
  137. var imageFilepath = ""
  138. if let data = parameter {
  139. for (key,value) in data {
  140. bodyString.append("--\(self.boundary)\r\n")
  141. if (value is String) {
  142. if (key == "filepath") {
  143. imageFilepath = value as! String
  144. } else {
  145. bodyString.append("Content-disposition: form-data; name=\"\(key)\"")
  146. bodyString.append("\r\n\r\n")
  147. bodyString.append(value as! String)
  148. bodyString.append("\r\n")
  149. }
  150. } else {
  151. // no things
  152. }
  153. }
  154. }
  155. let fileUrl = URL(fileURLWithPath: filepath)
  156. bodyString.append("--\(self.boundary)\r\n")
  157. bodyString.append("Content-disposition: form-data; name=\"file\"; filename=\"\(fileUrl.lastPathComponent)\"")
  158. bodyString.append("\r\n")
  159. bodyString.append("Content-Type: application/octet-stream")
  160. bodyString.append("\r\n\r\n")
  161. var mdata = Data()
  162. mdata.append(bodyString.data(using: .utf8)!)
  163. if let data = try?Data(contentsOf: fileUrl) {
  164. mdata.append(data)
  165. }
  166. mdata.append("\r\n".data(using: .utf8)!)
  167. if (!imageFilepath.isEmpty) {
  168. var dataString = ""
  169. let fileUrl = URL(fileURLWithPath: imageFilepath)
  170. dataString.append("--\(self.boundary)\r\n")
  171. dataString.append("Content-disposition: form-data; name=\"image\"; filename=\"\(fileUrl.lastPathComponent)\"")
  172. dataString.append("\r\n")
  173. dataString.append("Content-Type: application/octet-stream")
  174. dataString.append("\r\n\r\n")
  175. // var mdata = Data()
  176. mdata.append(dataString.data(using: .utf8)!)
  177. if let data = try?Data(contentsOf: fileUrl) {
  178. mdata.append(data)
  179. }
  180. mdata.append("\r\n".data(using: .utf8)!)
  181. }
  182. mdata.append("--\(self.boundary)--".data(using: .utf8)!)
  183. let session = URLSession.shared
  184. // request.timeoutInterval = 120
  185. request.httpBody = mdata
  186. let task = session.dataTask(with: request) {data , response, error in
  187. DispatchQueue.main.async {
  188. if let _ = error {
  189. callback(false, nil, error.debugDescription)
  190. return
  191. }
  192. guard let _data = data else {
  193. callback(false, nil, error.debugDescription)
  194. return
  195. }
  196. if let result = self.JsonDataParse(data: _data) {
  197. let resultMap = KMRequestResultModel(dict: result)
  198. callback(resultMap.isSuccess(), resultMap.data as? [String : Any], error.debugDescription)
  199. return
  200. }
  201. callback(false, nil, error.debugDescription)
  202. }
  203. }
  204. task.resume()
  205. }
  206. // MARK: - Private Methods
  207. private class func JsonDataParse(data: Data) -> Dictionary<String,Any>? {
  208. let result = try?JSONSerialization.jsonObject(with: data, options: .mutableContainers)
  209. return result as? Dictionary<String, Any>
  210. }
  211. }