Net是用Swift编写的高效HTTP网络库。
🌟 特性
- URL / JSON / 属性列表参数编码
- 上传文件 / 数据 / 流 / 多部分表单数据
- 使用请求或恢复数据下载文件
- 使用URLCredential进行身份验证
- 基本、Bearer和自定义授权处理
- 默认和自定义缓存控制
- 默认和自定义内容类型
- 上传和下载进度闭包支持进度(仅iOS>=11)
- cURL命令调试输出
- 请求和响应拦截器
- 异步和同步任务执行
- 推断响应对象类型
- 网络可达性
- TLS证书和公钥固定
- 重试请求
- Codable / Decodable / Encodable协议兼容(JSON / 属性列表)
- 自定义可接受状态码范围
- 支持watchOS
- 支持tvOS
- 支持macOS
- Alamofire实现
- MoyaProvider扩展
- Kommander扩展
- RxSwift扩展
- 占位符实现
📋 要求
- iOS 8.0+ / macOS 10.9+ / tvOS 9.0+ / watchOS 2.0+
- Xcode 9.0+
- Swift 4.0+
📲 安装
Net通过CocoaPods可用。要安装它,只需将以下行添加到Podfile中:
pod 'NetClient'
为了与Swift 3兼容,使用
pod 'NetClient', '~> 0.2'
Carthage来安装
或者您可以使用github "intelygenz/NetClient-iOS"
Swift Package Manager安装
或者使用dependencies: [
.package(url: "https://github.com/intelygenz/NetClient-iOS.git")
]
🐒 用法
构建NetRequest
import Net
do {
let request = try NetRequest.builder("YOUR_URL")!
.setAccept(.json)
.setCache(.reloadIgnoringLocalCacheData)
.setMethod(.PATCH)
.setTimeout(20)
.setJSONBody(["foo", "bar"])
.setContentType(.json)
.setServiceType(.background)
.setCacheControls([.maxAge(500)])
.setURLParameters(["foo": "bar"])
.setAcceptEncodings([.gzip, .deflate])
.setContentEncodings([.gzip])
.setBasicAuthorization(user: "user", password: "password")
.setHeaders(["foo": "bar"])
.build()
} catch {
print("Request error: \(error)")
}
异步请求
import Net
let net = NetURLSession()
net.data(URL(string: "YOUR_URL")!).async { (response, error) in
do {
if let object: [AnyHashable: Any] = try response?.object() {
print("Response dictionary: \(object)")
} else if let error = error {
print("Net error: \(error)")
}
} catch {
print("Parse error: \(error)")
}
}
同步请求
import Net
let net = NetURLSession()
do {
let object: [AnyHashable: Any] = try net.data("YOUR_URL").sync().object()
print("Response dictionary: \(object)")
} catch {
print("Error: \(error)")
}
从缓存请求数据
import Net
let net = NetURLSession()
do {
let object: [AnyHashable: Any] = try net.data("YOUR_URL").cached().object()
print("Response dictionary: \(object)")
} catch {
print("Error: \(error)")
}
跟踪进度
import Net
let net = NetURLSession()
do {
let task = try net.data("YOUR_URL").progress({ progress in
print(progress)
}).sync()
} catch {
print("Error: \(error)")
}
为所有请求添加拦截器
import Net
let net = NetURLSession()
net.addRequestInterceptor { request in
request.addHeader("foo", value: "bar")
request.setBearerAuthorization(token: "token")
return request
}
重试请求
import Net
let net = NetURLSession()
net.retryClosure = { response, _, _ in response?.statusCode == XXX }
do {
let task = try net.data("YOUR_URL").retry({ response, error, retryCount in
return retryCount < 2
}).sync()
} catch {
print("Error: \(error)")
}
🧙♂️ 可编码
可编码
import Net
let request = NetRequest.builder("YOUR_URL")!
.setJSONObject(Encodable())
.build()
可解码
import Net
let net = NetURLSession()
do {
let object: Decodable = try net.data("YOUR_URL").sync().decode()
print("Response object: \(object)")
} catch {
print("Error: \(error)")
}
🤝 集成
Alamofire 吗?
喜欢pod 'NetClient/Alamofire'
import Net
let net = NetAlamofire()
...
Moya 吗?
喜欢pod 'NetClient/Moya'
import Net
import Moya
let request = NetRequest("YOUR_URL")!
let provider = MoyaProvider<NetRequest>()
provider.request(request) { result in
switch result {
case let .success(response):
print("Response: \(response)")
case let .failure(error):
print("Error: \(error)")
}
}
Kommander 吗?
喜欢pod 'NetClient/Kommander'
import Net
import Kommander
let net = NetURLSession()
let kommander = Kommander.default
net.data(URL(string: "YOUR_URL")!).execute(by: kommander, onSuccess: { object in
print("Response dictionary: \(object as [AnyHashable: Any])")
}) { error in
print("Error: \(String(describing: error?.localizedDescription))")
}
net.data(URL(string: "YOUR_URL")!).executeDecoding(by: kommander, onSuccess: { object in
print("Response object: \(object as Decodable)")
}) { error in
print("Error: \(String(describing: error?.localizedDescription))")
}
RxSwift 吗?
喜欢pod 'NetClient/RxSwift'
import Net
import RxSwift
let request = NetRequest("YOUR_URL")!
_ = net.data(request).rx.response().observeOn(MainScheduler.instance).subscribe { print($0) }
方法存根 实现
pod 'NetClient/Stub'
import Net
let net = NetStub()
net.asyncBehavior = .delayed(.main, .seconds(10)) // If you want to delay the response.
net.nextResult = .response(NetResponse.builder()....build())
// Your test request here
net.nextResult = .error(.net(code: 500, message: "Your network error.", headers: ..., object: ..., underlying: ...))
// Your test request here
❤️ 等等。
- 非常欢迎贡献。
- 赞赏归功(让我们传播消息!),但并非强制。
💻 作者
👮♂️ 许可证
网络软件许可协议为MIT许可。详细信息请参阅LICENSE文件。