Moya:Swift 网络请求该有的样子
Moya:Swift 网络请求该有的样子
Moya 在 GitHub 上攒了 15,365 个 Star。
做 iOS 开发的人基本都写过自己的网络层。一个 APIManager,一个 NetworkService,把 Alamofire 包一层,然后越写越乱。URL 拼错、参数漏传、测试写不动,每个新人进来都要重新理解一遍这套东西。这些坑几乎人人都踩过。
Moya 做的事情就一件:把网络请求这层抽象标准化,让团队用同一套方式定义和调用 API。
1、 它解决什么问题

直接用 Alamofire,你得自己管 URL 拼接、参数编码、请求头设置。每个项目写一套,写完还不好测。团队大了以后,每个人写的网络层风格都不一样,维护成本直线上升。
Moya 在 Alamofire 上面再抽象一层,把 API 端点定义成 Swift 枚举。这么做的好处很直接:编译器帮你检查有没有调错接口,参数类型对不对,返回值处理了没有。写单元测试的时候直接用 stub 替换,不用发真实的网络请求。
核心能力三条:编译期接口检查、枚举定义端点、一等公民的测试替身。
2、 怎么用

先定义一个枚举,把你的 API 端点写清楚:
enum GitHub {
case zen
case userProfile(String)
}
然后创建 provider 发请求:
let provider = MoyaProvider<GitHub>()
provider.request(.userProfile("ashfurrow")) { result in
switch result {
case let .success(response):
let data = response.data
let code = response.statusCode
case let .failure(error):
// 网络层故障,超时或连不上
}
}
URL 和参数编码全部由枚举自动处理,不会再出现拼错 URL 或者漏传参数的情况。服务端返回的 4xx 或 5xx 会被包装成 success 回调里的 response,由你自己判断状态码。
3、 响应式扩展
Moya 提供三套响应式扩展:ReactiveSwift、RxSwift、和 Apple 的 Combine。根据项目技术栈选一个就好,三套 API 设计思路一致。
以 Combine 为例:
let cancellable = provider.requestPublisher(.userProfile("ashfurrow"))
.sink(receiveCompletion: { completion in
guard case let .failure(error) = completion else { return }
print(error)
}, receiveValue: { response in
image = UIImage(data: response.data)
})
每套扩展都附带 mapImage()、mapJSON()、mapString() 操作符,可以把网络响应直接转成 UIImage、字典或字符串。转换失败会发出错误信号,不用手动做类型判断。
4、 安装
支持 Swift Package Manager、CocoaPods、Carthage 三种方式。
SPM:在 Package.swift 的 dependencies 中添加 Moya,版本号指定 from: "15.0.0",target dependencies 里写 "Moya" 或对应的响应式模块名。
CocoaPods:
pod 'Moya', '~> 15.0'
# 或者带响应式扩展
pod 'Moya/RxSwift', '~> 15.0'
Carthage:
github "Moya/Moya" ~> 15.0
当前最新版本 15.0.0,要求 Swift 5.2 以上。从旧版本升级可以参考项目自带的迁移指南。
5、 适合谁
已经在用 Alamofire、但受够了每个项目重复搭网络层的团队。需要在编译期就抓住接口调用错误的项目。对网络层有测试要求、想用 stub 跑单元测试的场景。
Moya 在 Artsy 的拍卖应用中经过生产环境验证。MIT 协议开源,社区活跃,有中文文档。
期就抓住接口调用错误的项目。对网络层有测试要求、想用 stub 跑单元测试的场景。
Moya 在 Artsy 的拍卖应用中经过生产环境验证。MIT 协议开源,社区活跃,有中文文档。
更多推荐
所有评论(0)