1.ApiService介绍
文件门路:classes/Network/ApiService.swift
- ApiService 申请携带参数
ApiService 申请IP地址(BaseUrl)
var baseURL: URL { switch self { case .logout, .login, .register, .captcha, .cloudUserDetail, .editCloudUser, .defaultLocationList, .areaList, .createArea: return URL(string: "\(cloudUrl)/api")! case .scanQRCode(_, let url, _, _, _): return URL(string: "\(url)/api")! case .addSADevice(let url, _): return URL(string: "\(url)/api")! case .checkSABindState(let url): return URL(string: "\(url)/api")! // brand case .brands(_, let area): return area.requestURL case .brandDetail(_, let area): return area.requestURL // plugin case .pluginDetail(_, let area): return area.requestURL...}
ApiService 申请地址的拼接(Path)
var path: String { switch self { case .sceneList: return "/scenes" case .createScene: return "/scenes" case .deleteScene(let scene_id ,_): return "/scenes/\(scene_id)" case .editScene(let scene_id, _, _): return "/scenes/\(scene_id)" case .sceneExecute(let scene_id,_, _): return "/scenes/\(scene_id)/execute" case .sceneDetail(let scene_id ,_): return "/scenes/\(scene_id)" case .sceneLogs: return "/scene_logs" }}
ApiService 申请形式
var method: Moya.Method { switch self { case .sceneList: return .get case .createScene: return .post case .deleteScene: return .delete case .sceneExecute: return .post case .sceneDetail: return .get case .editScene: return .put case .sceneLogs: return .get }}
ApiService 创立Parameters Task
var task: Task { switch self { case .sceneLogs(let start, let size, _): return .requestParameters(parameters: ["start": start, "size": size], encoding: URLEncoding.default) case .sceneDetail(_, _): return .requestPlain case .createScene(let scene, _): let json = scene.toJSON() ?? [:] return .requestParameters(parameters: json, encoding: JSONEncoding.default) case .deleteScene(_, _): return .requestPlain case .editScene(_, let scene, _): let json = scene.toJSON() ?? [:] return .requestParameters(parameters: json, encoding: JSONEncoding.default) case .sceneExecute(_,let is_execute, _): return .requestParameters(parameters: ["is_execute": is_execute], encoding:JSONEncoding.default) }}
2.扩大Moya数据申请形式:
网络申请办法 extension MoyaProvider { ... } extension MoyaProvider {@discardableResultfunc requestModel<T: BaseModel>(_ target: Target, modelType: T.Type, successCallback: ((_ response: T) -> Void)?, failureCallback: ((_ code: Int, _ errorMessage: String) -> Void)? = nil) -> Moya.Cancellable? { return request(target) { (result) in switch result { case .success(let response): if printDebugInfo { print("-----------------------------< ApiService >--------------------------------") print(Date()) print("---------------------------------------------------------------------------") print("header: \(target.headers ?? [:])") print("---------------------------------------------------------------------------") print("method: \(target.method.rawValue)") print("---------------------------------------------------------------------------") print("baseUrl: \(target.baseURL)") print("---------------------------------------------------------------------------") print("target: \(target.path)") print("---------------------------------------------------------------------------") print("parameters: \(target.task)") } guard response.statusCode == 200, let model = response.data.map(ApiServiceResponseModel<T>.self) else { failureCallback?(response.statusCode, "error: \(String(data: response.data, encoding: .utf8) ?? "unknown") code: \(response.statusCode)") print("---------------------------------------------------------------------------") print("error: \(String(data: response.data, encoding: .utf8) ?? "unknown")") print("---------------------------------------------------------------------------\n\n") return } if printDebugInfo { print("---------------------------------------------------------------------------") print(model.toJSONString(prettyPrint: true) ?? "") print("---------------------------------------------------------------------------\n\n") } if model.status == 0 { successCallback?(model.data) } else { failureCallback?(model.status, model.reason) if model.status == 2008 || model.status == 2009 { /// 云端登录状态失落 DispatchQueue.main.async { SceneDelegate.shared.window?.makeToast("登录状态失落".localizedString) AppDelegate.shared.appDependency.authManager.lostLoginState() } } } case .failure(let error): let moyaError = error as MoyaError let statusCode = moyaError.response?.statusCode ?? -1 let errorMessage = "error" if printDebugInfo { print("-----------------------------< ApiService >--------------------------------") print(Date()) print("---------------------------------------------------------------------------") print("header: \(target.headers ?? [:])") print("---------------------------------------------------------------------------") print("method: \(target.method.rawValue)") print("---------------------------------------------------------------------------") print("baseUrl: \(target.baseURL)") print("---------------------------------------------------------------------------") print("target: \(target.path)") print("---------------------------------------------------------------------------") print("parameters: \(target.task)") print("---------------------------------------------------------------------------") print("Error: \(error.localizedDescription) ErrorCode: \(statusCode)") print("---------------------------------------------------------------------------\n\n") } failureCallback?(statusCode, errorMessage) return } }}}ApiServiceManager是基于ApiService再封装了一层的单例类extension ApiServiceManager { /// 获取验证码/// - Parameters:/// - type: 验证码类型/// - target: 指标/// - successCallback: 胜利回调/// - failureCallback: 失败回调/// - Returns: nilfunc getCaptcha(type: CaptchaType, target: String, successCallback: ((CaptchaResponse) -> ())?, failureCallback: ((Int, String) -> ())?) { apiService.requestModel(.captcha(type: type, target: target), modelType: CaptchaResponse.self, successCallback: successCallback, failureCallback: failureCallback)}/// 注册/// - Parameters:/// - phone: 手机号/// - password: 明码/// - captcha: 验证码/// - captchaId: 验证码id/// - successCallback: 胜利回调/// - failureCallback: 失败回调/// - Returns: nilfunc register(phone: String, password: String, captcha: String, captchaId: String, successCallback: ((RegisterResponse) -> ())?, failureCallback: ((Int, String) -> ())?) { apiService.requestModel(.register(phone: phone, password: password, captcha: captcha, captcha_id: captchaId), modelType: RegisterResponse.self, successCallback: successCallback, failureCallback: failureCallback)}...}
内部申请数据接口办法 eg:设施列表
ApiServiceManager.shared.deviceList(area: area) { [weak self] response in guard let self = self else { return }// 申请胜利回调 ...} failureCallback: { [weak self] (code, err) in guard let self = self else { return }// 申请失败回调 ...}
3.判断是否在局域网内办法
/// 申请的地址url(判断申请sa还是sc) var requestURL: URL { if macAddr == AppDelegate.shared.appDependency.networkManager.getWifiBSSID() && macAddr != nil { return URL(string: "\(sa_lan_address ?? "")/api")! } else if AppDelegate.shared.appDependency.authManager.isLogin && id > 0 { return URL(string: "\(cloudUrl)/api")! } else { return URL(string: "\(sa_lan_address ?? "http://")")! } }