RxRestClient 3.0.0

RxRestClient 3.0.0

STDev Team 维护。



 
依赖
RxSwift>= 6.0
RxAlamofire>= 6.0
 

  • Tigran Hambardzumyan

RxRestClient

CI Status Version License Platform

示例

要运行示例项目,请克隆仓库,然后首先从示例目录中运行 pod install

要求

  • iOS 10.0+
  • tvOS 10.0+
  • macOS 10.12+
  • Swift 5.1+
  • Xcode 11+

迁移指南

安装

CocoaPods

RxRestClient 通过 CocoaPods 提供。要安装它,只需将以下行添加到您的 Podfile

pod 'RxRestClient'
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 类型(StringData)。

然后,创建请求模型

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")

如果 baseURLnil,则尝试将提供的 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 文件。