Moya:Swift 网络请求该有的样子

Moya 在 GitHub 上攒了 15,365 个 Star。

做 iOS 开发的人基本都写过自己的网络层。一个 APIManager,一个 NetworkService,把 Alamofire 包一层,然后越写越乱。URL 拼错、参数漏传、测试写不动,每个新人进来都要重新理解一遍这套东西。这些坑几乎人人都踩过。

Moya 做的事情就一件:把网络请求这层抽象标准化,让团队用同一套方式定义和调用 API。

1、 它解决什么问题

正文顶部截图

直接用 Alamofire,你得自己管 URL 拼接、参数编码、请求头设置。每个项目写一套,写完还不好测。团队大了以后,每个人写的网络层风格都不一样,维护成本直线上升。

Moya 在 Alamofire 上面再抽象一层,把 API 端点定义成 Swift 枚举。这么做的好处很直接:编译器帮你检查有没有调错接口,参数类型对不对,返回值处理了没有。写单元测试的时候直接用 stub 替换,不用发真实的网络请求。

核心能力三条:编译期接口检查、枚举定义端点、一等公民的测试替身。

2、 怎么用

README区域截图

先定义一个枚举,把你的 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 协议开源,社区活跃,有中文文档。

更多推荐