ReactiveNetwork
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 文件。