APIManager

Swift Version Build Status Documentation Converage Release Version GitHub License

APIManager 是一个用于抽象 RESTful API 请求的框架。

要求

注意

安装

Swift Package Manager

Swift Package Manager 是一个用于自动化 Swift 代码分发的工具,并且集成到了 swift 编译器中。

一旦你设置好了你的 Swift 包,添加 APIManager 作为依赖项就像将它添加到你的 Package.swiftdependencies 值中一样简单。

dependencies: [
    .Package(url: "https://github.com/rauhul/api-manager.git", from: "0.4.0")
]

使用

APIManager 依赖用户创建与他们正在使用的 RESTful API 相关的 APIServicesAPIReturnable 类型。 APIServices 包含对各种端点的描述,这些端点以原生 Swift 对象的形式返回其响应。

创建一个 APIReturnable 类型

一个 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

一个 APIService 由 3 个组件组成。

  1. 一个 baseURL。 此服务中的端点将附加到此 URL 段。 因此,baseURL 通常看起来像该服务与之通信的 API 的根 URL。
open class var baseURL: String {
    return "https://api.example.com"
}
  1. 要与 APIService 中端点发出的 APIRequest 一起发送的 HTTPHeaders
open class var headers: HTTPHeaders? {
    return [
        "Content-Type": "application/json"
    ]
}
  1. 一组您想使用的 RESTful API 端点。 这些应该是围绕 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

现在您有了一个 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 文件。