ReactiveNetwork 0.3.1

ReactiveNetwork 0.3.1

Jimmy Aumard 维护。



 
依赖项
RxSwift~> 4.0
RxCocoa~> 4.0
 

ReactiveNetwork

CI Status Version License Platform

ReactiveNetwork 是一个用于执行 REST JSON API 请求并将结果解析为 Swift 对象的轻量级库。Swift 4 是必需的,因为它利用了 Swift 4 的原生功能来使用 Codable 解析 JSON 负载。

示例

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

用法

您可以查看示例应用程序,以下是如何使用此库来调用 REST JSON API 的快速示例

创建 ReactiveNetwork 实例

let reactiveNetwork = ReactiveNetwork.Builder("https://mywebservicebaseurl/").build()

此对象具有以下可用的方法,您可以使用它们来执行 HTTP 请求

带正文请求

doRequest<T: Codable, R: Codable>(method: String = "POST", 
                                  path: String,
                                  body: T,
                                  queryParams: Dictionary<String, String> = [:],
                                  pathParams: Dictionary<String, String> = [:],
                                  headers: Dictionary<String, String> = [:]) -> Single<R>
                                  
doRequest<T: Codable>(method: String = "POST", 
                      path: String,
                      body: T,
                      queryParams: Dictionary<String, String> = [:],
                      pathParams: Dictionary<String, String> = [:],
                      headers: Dictionary<String, String> = [:]) -> Completable                                   

不带正文请求

doRequest<T: Codable>(method: String = "GET", 
                      path: String, 
                      queryParams: Dictionary<String, String> = [:],
                      pathParams: Dictionary<String, String> = [:],
                      headers: Dictionary<String, String> = [:]) -> Single<T>
                      
doRequest(method: String = "DELETE", 
          path: String, 
          queryParams: Dictionary<String, String> = [:],
          pathParams: Dictionary<String, String> = [:],
          headers: Dictionary<String, String> = [:]) -> Completable                       

其中

  • method 是要使用的 http 方法(如 GET、POST、PUT、DELETE...)
  • path 是获取资源的子路径(如获取用户列表、用户/post...)
  • body 是要发送到服务器的扩展 Codable 的 swift 对象
  • queryParams 是要作为查询参数发送的键/值字典(如 ?sort=desc&filter=test)
  • pathParams 是在动态 path 的情况下要替换的 URL 部分如 path="/users/{subcat}",则 subcat:mycatvalue 应传递
  • headers 要作为键/值传递给请求的 HTTP 报头(如 Content-Type:application/json)

考虑以下有效载荷

{
  "id": 1,
  "name": "John",
  "firstName": "Paul",
  "email": "[email protected]"
}

首先创建您的模型,它必须扩展 Codable

class User: Codable {
    let id: Int?
    let name: String
    let firstName: String
    let phone: String?
    let email: String
    
    init(id: Int?, name: String, firstName: String, phone: String?, email: String) {
        self.id = id
        self.name = name
        self.firstName = firstName
        self.phone = phone
        self.email = email
    }
}

然后创建您的网络数据源,它将调用网络服务

class UserNetworkDataSource {
    private let reactiveNetwork: ReactiveNetwork
    private let basePath: String

    init(_ reactiveNetwork: ReactiveNetwork) {
        self.reactiveNetwork = reactiveNetwork
        self.basePath = "users"
    }

    func get() -> Single<[T]> {
        return reactiveNetwork.doRequest(method: "GET", path: self.basePath)
    }

    func get(_ id: Int) -> Single<T> {
        return reactiveNetwork.doRequest(method: "GET", path: "\(self.basePath)/\(id)")
    }

    func create(_ item: T) -> Single<T> {
        return reactiveNetwork.doRequest(method: "POST", path: self.basePath, body: item)
    }

    func update(_ id: Int, item: T) -> Single<T> {
        return reactiveNetwork.doRequest(method: "PUT", path: "\(self.basePath)/\(id)", body: item)
    }

    func delete(_ id: Int) -> Completable {
        return reactiveNetwork.doRequest(method: "DELETE", path: "\(self.basePath)/\(id)").asCompletable()
    }
}

或者您可以使用内建的这样一个:

class UserNetworkDataSource: NetworkDataSource<User> {

    init(_ reactiveNetwork: ReactiveNetwork) {
        super.init("users", reactiveNetwork: ReactiveNetwork)
    }
}

拦截器

现在在这里需要全局修改请求或响应,这就是拦截器发挥作用的地方。现有两个内置拦截器,LogInterceptor 和 HeaderInterceptor。它们可以用 ReactiveNetwork.Builder 的 addInterceptor 方法添加。可以添加多个拦截器,它们将按顺序执行。

LogInterceptor

它将在控制台为您记录所有请求和响应,应该有助于调试您的调用。

LogInterceptor(level: .debug)

有三个级别

  • 无,不会记录信息
  • 信息,将记录基本信息,url,状态码...
  • 调试,将记录所有信息,url,头信息,正文,状态码...

HeaderInterceptor

它将为所有请求全局添加头部信息。只需在初始化时传递它们。

HeaderInterceptor(["Content-Type": "application/json", "Accept": "application/json"])

自定义拦截器

您可以通过实现两个协议来创建自己的拦截器,RequestInterceptor(如果您的拦截器需要拦截请求)以及 ResponseInterceptor(用于拦截响应)。您可以将内置拦截器的代码作为示例来查看。

需求

安装

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

pod 'ReactiveNetwork'

发布

要部署此 pod

pod lib lint
git tag 'x.x.x'
git push --tags
pod trunk push ReactiveNetwork.podspec

作者

jaumard, [email protected]

许可

ReactiveNetwork 在 MIT 许可下可用。有关更多信息,请参阅 LICENSE 文件。