APIManager 是一个用于抽象 RESTful API 请求的框架。
Swift Package Manager 是一个用于自动化 Swift 代码分发的工具,并且集成到了 swift
编译器中。
一旦你设置好了你的 Swift 包,添加 APIManager 作为依赖项就像将它添加到你的 Package.swift
的 dependencies
值中一样简单。
dependencies: [
.Package(url: "https://github.com/rauhul/api-manager.git", from: "0.4.0")
]
APIManager 依赖用户创建与他们正在使用的 RESTful API 相关的 APIServices
和 APIReturnable
类型。 APIServices
包含对各种端点的描述,这些端点以原生 Swift 对象的形式返回其响应。
一个 APIReturnable 类型只需要遵守一个方法 init(from: Data) throws
。 APIManager 扩展了 Decodable
类型,使其也成为 APIReturnable
。 下面是一个示例实现
extension APIReturnable where Self: Decodable {
init(from data: Data) throws {
self = try JSONDecoder().decode(Self.self, from: data)
}
}
一个 APIService 由 3 个组件组成。
baseURL
。 此服务中的端点将附加到此 URL 段。 因此,baseURL 通常看起来像该服务与之通信的 API 的根 URL。open class var baseURL: String {
return "https://api.example.com"
}
APIService
中端点发出的 APIRequest
一起发送的 HTTPHeaders
。open class var headers: HTTPHeaders? {
return [
"Content-Type": "application/json"
]
}
APIRequest
构造函数的简单包装器,可以接收数据(作为 HTTPParameters
和/或作为 JSON 字典 [String: Any]
的 HTTPBody
)。 例如,如果您想按 ID 获取用户信息,则端点可能如下所示open class func getUser(byId id: Int) -> APIRequest<ExampleReturnType> {
return APIRequest<ExampleReturnType>(service: Self, endpoint: "/users", params: ["id": id], body: nil, method: .GET)
}
现在您有了一个 APIService
,您可以使用它来发出 RESTful API 请求。
我们需要访问的所有 RESTful API 端点都应该已经在我们的 APIService
中定义,因此使用它们只是调用它们的问题。
使用上面的示例服务,我们可以发出请求来获取与 ID 452398 关联的用户
let request = ExampleService.getUser(byId: 452398)
然后,使用以下方法执行 APIRequest
request.perform(withAuthorization: nil)
但是,这使我们无法访问响应或潜在的错误,并且还需要多行才能完成真正的一项操作。 方便地,APIManager
允许我们使用简单的链式语法解决此问题。 我们可以指定成功、取消和失败块。 下面可以看到这个新的请求
ExampleService.getUser(byId: 452398)
.onSuccess { (returnValue: ReturnType) in
// Handle Success (Background thread)
DispatchQueue.main.async {
// Handle Success (main thread)
}
}
.onFailure { (error) in
// Handle Failure (Background thread)
DispatchQueue.main.async {
// Handle Failure (main thread)
}
}
.perform(withAuthorization: nil)
请打开一个 issue以获得支持。
请使用Github Flow进行贡献。 创建一个分支,添加提交,并打开一个 pull request。
本项目根据 MIT 许可证获得许可。 有关此许可证的完整副本,请查看 LICENSE 文件。