// // APIProvider.swift // HealthyZG // // Created by 林 on 2020/5/18. // Copyright © 2020 Lin. All rights reserved. // import Foundation import Moya import RxSwift // swiftlint:disable:next identifier_name public let GatewayStatusCodeKey = "GatewayStatusCodeKey" typealias Parameters = [String: Any] private func JSONResponseDataFormatter(_ data: Data) -> String { do { let dataAsJSON = try JSONSerialization.jsonObject(with: data) let prettyData = try JSONSerialization.data(withJSONObject: dataAsJSON, options: .prettyPrinted) return String(data: prettyData, encoding: .utf8) ?? String(data: data, encoding: .utf8) ?? "" } catch { return String(data: data, encoding: .utf8) ?? "" } } private func reversedPrint(_ separator: String, terminator: String, items: Any...) { for item in items { if let msg = item as? String { LogInfo(msg) } } } // MARK: - Provider setup let requestClosure = { (endpoint: Endpoint, done: MoyaProvider.RequestResultClosure) in do { var request = try endpoint.urlRequest() // Modify the request however you like. request.timeoutInterval = 60 //设置请求超时时间 done(.success(request)) } catch { done(.failure(MoyaError.underlying(error, nil))) } } /// 通用 Logger,仅 playback 跳过 Response Body private final class FilteredLogger: PluginType { private let logger = NetworkLoggerPlugin(configuration: .init( formatter: .init(responseData: JSONResponseDataFormatter), logOptions: .verbose )) func willSend(_ request: RequestType, target: TargetType) { logger.willSend(request, target: target) } func didReceive(_ result: Result, target: TargetType) { if let mt = target as? MultiTarget, case let .target(underlying) = mt, let api = underlying as? MultiTargetProtocol, api.suppressResponseLog, case .success(let response) = result { print("[suppress] \(api.path) status: \(response.statusCode)") return } logger.didReceive(result, target: target) } } public let APIProvider = MoyaProvider(requestClosure: requestClosure, plugins: [ SignPlugin(), FilteredLogger(), NetworkActivityPlugin(networkActivityClosure: { change, _ in #if !SHARE_EXTENSION DispatchQueue.main.async { switch change { case .began: UIApplication.shared.isNetworkActivityIndicatorVisible = true case .ended: UIApplication.shared.isNetworkActivityIndicatorVisible = false } } #endif }) ]).rx public extension Error { var underlyingError: NSError? { guard let moyaError = self as? MoyaError else { return nil } guard case let .underlying(error, _) = moyaError else { return nil } return error as NSError } var gatewayStatusCode: Int { let error = underlyingError ?? self as NSError return error.code } var gatewayMessage: String? { let error = underlyingError ?? self as NSError return error.userInfo[NSLocalizedDescriptionKey] as? String } var responseData: Response? { guard let moyaError = self as? MoyaError else { return nil } guard case let .underlying(_, response) = moyaError else { return nil } return response } var isShowErrorTips: Bool { let error = underlyingError ?? self as NSError return error.userInfo["isShowTip"] as? Bool ?? true } } public extension MoyaError { var innerError: NSError? { switch self { case let .encodableMapping(error): return error as NSError case let .objectMapping(error, _): return error as NSError case let .underlying(error, _): return error as NSError case let .parameterEncoding(error): return error as NSError default: return nil } } } // 网关状态码 enum GatewayStatusCode: Int { // 请求成功 case success = 0 // case failure = -1 // 版本过低 case outdateVersion = 3 /** ============== 风控 ============== */ case riskControl = 701 /** ============== 用户权限相关 200~300 ============== */ // 登录失效 case userLoginExpair = 1001003 // 权限不足 case noAuthority = 500 // 审核中 case review = 201 /** ============== 业务 ============== */ // 您创建的圈子个数已达上限,请升级会员等级 case groupLimit = 20009 /** ============== 未知错误 ============== */ case unknownError = -9999 }