前言

测试阶段,还未曾放到项目中使用,后续会继续优化调整,初始版本

环境

  pod 'Moya',  '14.0.0'pod 'HandyJSON',    '5.0.3-beta'Xcode 13.2

用法

1、基本模板

Moya 在对于 API 的封装是基于 enum,通过对于枚举不同端点的不同用法,生成请求。
如果项目小可以只有一个API.swift, 如果项目比较大,可以分模块,分成几个API.swift

public enum HJApi {case zencase version([String: String])  case sendMsg(String)case uploadHeadImage(parameters: [String:Any], imageDate:Data)
}extension HJApi: TargetType {
///域名public var baseURL: URL {switch self {case .version(_):return URL(string: "www.abc.com")!default:return URL(string: "www.def.com")!}}///请求地址放到这里public var path: String {switch self {case .zen:return "/abc/abcdef"case .version(_):return "/abc/abcdefghi"case .sendMsg(let msg):return "/abcd/abcdef/\(msg)" case .uploadHeadImage(parameters: _, imageDate: _):return "/file/user/upload.jhtml"}}///接口的请求类型public var method: Moya.Method {switch self {case .zen:return .getdefault:return .post}}///请求的参数在这里处理public var task: Task {switch self {case .version(let parameters): return .requestParameters(parameters: parameters, encoding: JSONEncoding.default)case .uploadHeadImage(parameters: let parameters, imageDate: let imgDate):let formData = MultipartFormData(provider: .data(imgDate), name: "file",fileName: "hangge.png", mimeType: "image/png")return .uploadCompositeMultipart([formData], urlParameters: parameters)default:return .requestPlain}}public var validationType: ValidationType {return .successCodes}// 用于单元测试public var sampleData: Data {return "{}".data(using: String.Encoding.utf8)!}public var headers: [String: String]? {return ["content-type": "application/json;charset=utf-8;","platform": "ios",]}
}

2.网络请求初始化

/// 网络请求发送的核心初始化方法,创建网络请求对象
private let provider = MoyaProvider<MultiTarget>(endpointClosure: endpointClosure, requestClosure: requestClosure, plugins: [networkPlugin], trackInflights: false)
///超时时长
private var requestTimeOut: Double = 30
/// 网络请求的基本设置,这里可以拿到是具体的哪个网络请求,可以在这里做一些设置
private let endpointClosure = {(target: TargetType) -> Endpoint inlet url = target.baseURL.absoluteString + target.pathvar task = target.taskvar endPoint = Endpoint(url: url,sampleResponseClosure: { .networkResponse(200, target.sampleData) },method: target.method,task: task,httpHeaderFields: target.headers)if let apiTarget = target as? MultiTarget,let tar = apiTarget.target as? HJApi  {switch tar {case .zen:requestTimeOut = 20return endPointdefault:return endPoint}}return endPoint
}
/// 网络请求的设置
private let requestClosure = { (endpoint: Endpoint, done: MoyaProvider.RequestResultClosure) indo {var request = try endpoint.urlRequest()// 设置请求时长request.timeoutInterval = requestTimeOut// 打印请求参数if let requestData = request.httpBody {print("请求的url:\(request.url!)" + "\n" + "\(request.httpMethod ?? "")" + "发送参数" + "\(String(data: request.httpBody!, encoding: String.Encoding.utf8) ?? "")")} else {print("请求的url:\(request.url!)" + "\(String(describing: request.httpMethod))")}if let header = request.allHTTPHeaderFields {print("请求头内容\(header)")}done(.success(request))} catch {done(.failure(MoyaError.underlying(error, nil)))}
}
/// NetworkActivityPlugin插件用来监听网络请求,界面上做相应的展示
/// 但这里我没怎么用这个。。。 loading的逻辑直接放在网络处理里面了
private let networkPlugin = NetworkActivityPlugin.init { changeType, _ inprint("networkPlugin \(changeType)")// targetType 是当前请求的基本信息switch changeType {case .began:print("开始请求网络")case .ended:print("结束")}
}
///返回数据
struct myResponseData: HandyJSON {var isSuccess: Bool?var code: String?var message: String?var data: String?
}

3. 网络请求封装

此处是返回NetWork网络请求封装

public class NetWork: NSObject {
}

在NETWork 里面的返回单个model和数组model以及字符串的网络请求封装,

///返回单 model 网络请求public class func request<T:HandyJSON>(target: TargetType,modelType: T.Type,successBlock: @escaping (_ code: String, _ model: T?,  _ msg:String) -> Void,failureBlock:@escaping (_ code: String, _ msg:String) -> Void){provider.request(MultiTarget(target)) { result inswitch result {case let .success(response):if let json = try? response.mapJSON() {responseData(json, { code, result, msg  inreturn successBlock(code, modelType.deserialize(from: result), msg)}, failureBlock)} else {return failureBlock("-1", "返回数据获取失败")}case let .failure(error):print("failure\(error.localizedDescription)")return failureBlock("-1", msgNetError)}}}

返回数组 model 网络请求

 ///返回数组 model 网络请求public class func request<T:HandyJSON>(target: TargetType,modelTypes: [T].Type,successBlock: @escaping (_ code: String, _ models: [T?], _ msg: String) -> Void,failureBlock:@escaping (_ code: String, _ msg:String) -> Void){provider.request(MultiTarget(target)) { result inswitch result {case let .success(response):if let json = try? response.mapJSON() {responseData(json, { code, result, msg inreturn successBlock(code, modelTypes.deserialize(from: result) ?? [], msg)}, failureBlock)} else {return failureBlock("-1", "返回数据获取失败")}case let .failure(error):print("failure\(error.localizedDescription)")return failureBlock("-1", msgNetError)}}}

返回字符串 网络请求

    ///返回字符串 网络请求public class func request(target: TargetType,successBlock: @escaping (_ code: String, _ result: String, _msg: String) -> Void,failureBlock:@escaping (_ code: String, _ msg:String) -> Void){provider.request(MultiTarget(target)) { result inswitch result {case let .success(response):if let json = try? response.mapJSON() {responseData(json, { code, result, msg inreturn successBlock(code, result, msg)}, failureBlock)} else {return failureBlock("-1", "返回数据获取失败")}case let .failure(error):print("failure\(error.localizedDescription)")return failureBlock("-1", msgNetError)}}}

数据解析封装

///数据处理
class func responseData(_ data: Any,_ successBlock: @escaping (_ code: String, _ result: String, _ msg:String) -> Void,_ failureBlock:@escaping (_ code: String, _ msg:String) -> Void) {if let obj = JSONDeserializer<myResponseData>.deserializeFrom(dict: data as? [String:Any]) {let message = obj.message ?? msgNetErrorguard let code = obj.code, !code.isEmpty else {return failureBlock("-1", message)}if "201" == code { return failureBlock(code, message)}if "200" == code {guard let dataEncode:String = obj.data, !dataEncode.isEmpty else {return successBlock(code, "", message)} DDLogInfo("\n<数据解析结果>:\n\(String(describing: result))")successBlock(code, result ?? "", message)}else{return failureBlock(code, message)}}else{return failureBlock("-1", msgNetError)}
}

3.网络请求:举个栗子

swift 使用Moya进行网络请求相关推荐

  1. Swift 掌控Moya的网络请求、数据解析与缓存

    Moya 在Swift开发中起着重要的网络交互作用,但是还有不如之处,比如网络不可用时,返回的 Response 为 nil,这时还得去解析相应的 Error Codable 可以帮助我们快速的解析数 ...

  2. SwiftUI 网络请求以及数据加载

    前言 SwiftUI只是UI,网络请求和Swift一样通用,至于网络请求封装这块我就不在一一赘述,想看的话请看swift 使用 Moya 进行网络请求 下面我来说下网络请求方法,我也是一个初学者,其中 ...

  3. Swift 网络请求 Moya+RxSwift

    Swift中优雅的网络请求 官方github // 1.定一个enum enum MyService {xxxxcase showUser(id: Int)xxx }// 2.扩展这个enum,符合 ...

  4. Swift 优雅的网络请求Moya

    Moya使用demo Moya 面向协议 Moya的模块组成 代码demo Controller中使用 Moya Moya是一个网络抽象层,它在底层将Alamofire进行封装,对外提供更简洁的接口供 ...

  5. 通过 Moya + RxSwift + Argo 完成网络请求

    作者:@请叫我汪二 授权本站转载. 最近在新项目中尝试使用 Moya+RxSwift+Argo 进行网络请求和解析,感觉还阔以,再来给大家安利一波. Moya Moya 是一个基于 Alamofire ...

  6. Swift 网络请求库Moya的使用

    Moya是Swift中的网络库Alamofire的二次封装,Alamofire本身使用起来是很简单方便的,例子如下: func loadData(){var param = [String:Strin ...

  7. iOS 使用Moya网络请求

    Moya最新版本11.0.2 由于前段时间写了这篇文章,最新Moya已更新最新版本,故此也更新了下用法,本人已使用,故特意奉上最新的使用demo供参考. Moya11.0.2Demo Moya简介 M ...

  8. 使用 Siesta 处理 Swift 网络请求

    (原文地址:https://medium.freecodecamp.o...) 今天我跟大家分享一下我的 iOS 网络库新欢,名字叫做 Siesta."她有啥特殊的?为啥我不直接用 Almo ...

  9. [译]使用 Siesta 处理 Swift 网络请求

    (原文地址:https://medium.freecodecamp.org/swift-networking-with-siesta-5b5e7089bd8f) 今天我跟大家分享一下我的 iOS 网络 ...

  10. Moya+ RxSwift+HandyJSON 优雅处理网络请求

    前言 在移动端的开发中,网络请求是必不可少的.之前写过Alamofire的简单使用,但是一般开发中都会对这些第三库封装,然后使用,之前自己封装的demo也是借鉴了一些Moya的设计思路.今天就介绍一下 ...

最新文章

  1. 政务大数据共享难题的破解路径有哪些?
  2. OGRE例子:Demo_Ocean 源码解析
  3. 文件解析漏洞总结-Apache
  4. Spark之scala学习(基础篇)待更新
  5. VSS (Visual Source Safe 2005) 用法详解(转载)
  6. python批量导入网页信息_python批量导入数据进Elasticsearch的实例
  7. 矩阵论与计算机英语论文,矩阵论翻译论文[8页].pdf
  8. java命令行导出、导入sql文件
  9. 软件测试——测试用例之场景法
  10. 小程序中的flex_在Flex应用程序中启用辅助功能
  11. 计算机组成原理——指令系统
  12. Dispatch简介
  13. 开机后黑屏看不到桌面_电脑开机后黑屏不显示桌面,但可以用管理器运行程序,怎么解决...
  14. ubuntu20 关闭防火墙_ubuntu中如何关闭防火墙
  15. 声网3D在线互动场景空间音频的实时渲染——如何把“声临其境”推向极致
  16. php zend optimizer,【原创】ZendOptimizer 的安装
  17. [python] 4.比心
  18. 浅谈tomcat优化
  19. Linux的时区修改方法
  20. tomcat 在线一键安装

热门文章

  1. LOJ.6073.[2017山东一轮集训Day5]距离(可持久化线段树 树链剖分)
  2. 差影-Variation Model
  3. mysql的group by语句不会产生_MySQL:为什么查询列表中多了它,GROUP BY语句就会报错呢?...
  4. 投入产出表之直接消耗系数和完全消耗系数计算--基于Excel
  5. python将数据导入数据库 atomic_Python3 连接 Sqlite3
  6. 2022.9.13 手机验证码登录功能
  7. Springboot毕设项目基于批示的督查督办管理系统c6m0djava+VUE+Mybatis+Maven+Mysql+sprnig)
  8. python中reduce是什么意思_python中的reduce是什么
  9. Java jsp导出Excel打开报格式或扩展名错误
  10. AtCoder Regular Contest 115 C - ℕ Coloring