Networking.swift 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. //
  2. // Networking.swift
  3. // JSJP_Student_sw
  4. //
  5. // Created by Ning.ge on 2023/5/30.
  6. //
  7. import Moya
  8. import RxSwift
  9. import Alamofire
  10. //typealias HomeNetworking = Networking<HomeAPI>
  11. typealias LoginNetworking = Networking<LoginAPI>
  12. final class Networking<Target: TargetType>: MoyaProvider<Target> {
  13. init(plugins: [PluginType] = [LoadingPlugin()]) {
  14. let sessionManager: Session = {
  15. let configuration = URLSessionConfiguration.default
  16. configuration.httpAdditionalHeaders = HTTPHeaders.default.dictionary
  17. configuration.timeoutIntervalForRequest = kTimeoutIntervalForRequest
  18. return Session(configuration: configuration, startRequestsImmediately: false)
  19. }()
  20. super.init(endpointClosure:Networking.endpointMapping, session:sessionManager, plugins:plugins)
  21. }
  22. func request(
  23. _ target: Target,
  24. _ isCache: Bool = false,
  25. file: StaticString = #file,
  26. function: StaticString = #function,
  27. line: UInt = #line
  28. ) -> Single<Response> {
  29. let requestString = "\(target.method) \(target.path)"
  30. return self.rx.request(target)
  31. .filterSuccessfulStatusCodes()
  32. .do(onSuccess: { (value) in
  33. let message = "SUCCESS: \(requestString) (\(value.statusCode))"
  34. log.debug(message, file: file, function: function, line: line)
  35. }, onError: {(error) in
  36. NotificationCenter.post(customNotification: .netError)
  37. if let response = (error as? MoyaError)?.response {
  38. if let jsonObject = try? response.mapJSON(failsOnEmptyData: false) {
  39. let message = "FAILURE: \(requestString) (\(response.statusCode))\n\(jsonObject)"
  40. log.warning(message, file: file, function: function, line: line)
  41. } else if let rawString = String(data: response.data, encoding: .utf8) {
  42. let message = "FAILURE: \(requestString) (\(response.statusCode))\n\(rawString)"
  43. log.warning(message, file: file, function: function, line: line)
  44. } else {
  45. let message = "FAILURE: \(requestString) (\(response.statusCode))"
  46. log.warning(message, file: file, function: function, line: line)
  47. }
  48. } else {
  49. let message = "FAILURE: \(requestString)\n\(error)"
  50. log.warning(message, file: file, function: function, line: line)
  51. }
  52. }, onSubscribed: {
  53. let message = "REQUEST: \(requestString)"
  54. log.debug(message, file: file, function: function, line: line)
  55. })
  56. }
  57. private static func endpointMapping<Target: TargetType>(target: Target) -> Endpoint {
  58. var param: [String:Any] = [:]
  59. switch target.task {
  60. case let .requestParameters(parameters, _):
  61. param = parameters
  62. default:break
  63. }
  64. var url = "\(target.baseURL)\(target.path)?"
  65. if target.method == .get {
  66. let s = param.map { (key,value) -> String in
  67. return "\(key)=\(value)&"
  68. }
  69. for p in s {
  70. url += p
  71. }
  72. url.remove(at: String.Index(utf16Offset: url.count - 1, in: url))
  73. log.info("请求链接:\(url) \n 请求方法:\(target.method)")
  74. } else {
  75. log.info("请求链接:\(url) \n 参数:\(param) \n 请求方法:\(target.method)")
  76. }
  77. return MoyaProvider.defaultEndpointMapping(for: target)
  78. }
  79. }