RxRestClient
示例
要运行示例项目,请克隆仓库,然后首先从示例目录中运行 pod install
。
要求
- iOS 10.0+
- tvOS 10.0+
- macOS 10.12+
- Swift 5.1+
- Xcode 11+
迁移指南
安装
Swift 包管理器
您可以通过在 Package.swift
文件中添加适当描述来使用 Swift 包管理器 安装 RxRestClient
import PackageDescription
let package = Package(
name: "YOUR_PROJECT_NAME",
targets: [],
dependencies: [
.package(url: "https://github.com/STDevTM/RxRestClient.git", from: "2.1.0")
]
)
接下来,将 RxRestClient
添加到您的目标依赖项中,如下所示
.target(
name: "YOUR_TARGET_NAME",
dependencies: [
"RxRestClient",
]
),
然后运行 swift package update
。
功能
- 简单请求方式
- 以响应式方式拥有响应状态
- 自定义能力
- 错误重试
- 处理网络可达状态
- 在网络恢复可达时重试
- 支持绝对和相对URL
- 支持 Swift Codable 协议
- 使用自定义 SessionManager
- 支持分页
- 完整文档
- 更多功能即将推出
如何使用
首先,您需要一个表示响应状态的 struct
并实现 ResponseState
协议。
struct RepositoriesState: ResponseState {
typealias Body = Data
var state: BaseState?
var data: [Repository]?
private init() {
state = nil
}
init(state: BaseState) {
self.state = state
}
init(response: (HTTPURLResponse, Data?)) {
if response.0.statusCode == 200, let body = response.1 {
self.data = try? JSONDecoder().decode(RepositoryResponse.self, from: body).items
}
}
static let empty = RepositoriesState()
}
必须声明期望的 Body 类型(String
或 Data
)。
然后,创建请求模型
struct RepositoryQuery: Encodable {
let q: String
}
接下来,您可以通过请求来获取存储库
import RxSwift
import RxRestClient
protocol RepositoriesServiceProtocol {
func get(query: RepositoryQuery) -> Observable<RepositoriesState>
}
final class RepositoriesService: RepositoriesServiceProtocol {
private let client = RxRestClient()
func get(query: RepositoryQuery) -> Observable<RepositoriesState> {
return client.get("https://api.github.com/search/repositories", query: query)
}
}
要自定义客户端,您可以使用 RxRestClientOptions
var options = RxRestClientOptions.default
options.addHeader(key: "x-apikey", value: "<API_KEY>")
client = RxRestClient(baseUrl: <BASE _URL>), options: options)
相对 URL 与绝对 URL
要使用相对 URL,您需要在初始化客户端对象时提供 <BASE_URL>
。
let client = RxRestClient(baseURL: <BASE_URL>)
在调用任何请求时,您可以提供 String
端点或绝对 URL
。如果是 String
,它将附加到 baseURL
。
client.get("rest/contacts")
如果 baseURL
是 nil
,则尝试将提供的 String
转换为 URL
。
即使您的客户端有 baseURL
,您也可以提供 URL
如此
if let url = URL(string: "https://api.github.com/search/repositories") {
client.get(url: url, query: ["q": search])
}
分页
分页支持仅适用于 GET
请求。为了使用分页(或无限滚动)功能,您需要实现以下查询和响应模型协议:
对于查询模型,您需要实现 PagingQueryProtocol
struct RepositoryQuery: PagingQueryProtocol {
let q: String
var page: Int
init(q: String) {
self.q = q
self.page = 1
}
func nextPage() -> RepositoryQuery {
var new = self
new.page += 1
return new
}
}
对于响应模型,您需要实现 PagingResponseProtocol
struct RepositoryResponse: PagingResponseProtocol {
let totalCount: Int
var repositories: [Repository]
private enum CodingKeys: String, CodingKey {
case totalCount = "total_count"
case repositories = "items"
}
// MARK: - PagingResponseProtocol
typealias Item = Repository
static var decoder: JSONDecoder {
return .init()
}
var canLoadMore: Bool {
return totalCount > items.count
}
var items: [Repository] {
get {
return repositories
}
set(newValue) {
repositories = newValue
}
}
}
对于响应状态,您需要使用 PagingState
类或自定义子类
final class RepositoriesState: PagingState<RepositoryResponse> {
...
}
准备好所有必要的模型后,您可以执行请求
client.get("https://api.github.com/search/repositories", query: query, loadNextPageTrigger: loadNextPageTrigger)
loadNextPageTrigger
是一个具有 Void
类型的 Observable
,用于触发客户端执行使用 nextPage()
函数生成的新查询模型的下一页请求。
作者
蒂格里安·汉巴祖良,[email protected]
支持
欢迎您提出任何建议、错误报告、功能请求或问题。提交问题
让我们知道
如果您在我们的项目中使用了我们的组件,我们非常愿意收到您项目的链接。只需发送电子邮件到 [email protected] 并让我们知道您是否有任何问题或建议。
许可协议
RxRestClient 根据 MIT 许可协议提供。有关更多信息,请参阅 LICENSE 文件。