Swift 优雅的网络抽象层。
设计
Alamofire 和 Moya 是优雅的 Swift 网络框架。它们各自都有其优点。当我使用它们时,我总是想结合两者的优点,使它们易于使用并保留其原始功能。因此,我写了 SolarNetwork。
- SLNetwork 对应于一个 SessionManager。
- SLTarget 对应于一个 Host,或一组具有相同配置的请求。
- SLRequest、SLDownloadRequest、SLUploadRequest 对应于数据、下载、上传请求。
- SLProgress 在下载或上传时返回进度。
- SLResponse 是请求的响应,您可以将其解码为 JsonObject 或 Model。
- SLPlugin 您可以在
willSend
中修改 SLRequest,在didReceive
中修改 SLResponse。 - SLReflection 将 SubSLRequest 的属性反射到 Alamofire.Parameters。
因此,一个完整的请求过程是
SLNetwork(SLTarget).request(SLRequest).willSend(SLRequest)
.progressClosure(SLProgress)
.reponseData(OriginalResponse)
.didReceive(SLResponse).decodeTo(Dictionary)
.completionClosure(SLResponse)
.decodeTo(Model: Decodable).dealWithError
在大多数情况下,您需要关注的通常是
SLNetwork(SLTarget).request(SLRequest)
.progressClosure(SLProgress)
.completionClosure(SLResponse)
特性
- URL/JSON/plist 参数编码
- 上传文件/数据/流/多部分表单数据
- 使用请求或暂停数据下载文件
- 使用URL凭证进行身份验证
- 使用Progress获取上传和下载进度
- 动态调整和重试请求
- TLS证书和公钥固定
- 网络可达性
- 预先填充DNS缓存
- 完整日志记录器
要求
- iOS 8.0+
- Xcode 9+
- Swift 4+
通信
- 如果您想要提问一个普遍性问题,请使用Stack Overflow。
- 如果您发现了一个错误,请创建一个issue。
- 如果您有功能请求,请创建一个issue。
- 如果您想进行贡献,请提交一个pull request。
安装
CocoaPods
CocoaPods是一个用于 Cocoa 项目的依赖管理器。您可以使用以下命令安装它
$ gem install cocoapods
需要CocoaPods 1.1+。
要使用 CocoaPods 将 SolarNetwork 集成到您的 Xcode 项目中,在您的 Podfile
中指定它
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '8.0'
use_frameworks!
target '<Your Target Name>' do
pod 'SolarNetwork'
end
然后,运行以下命令
$ pod install
Carthage
Carthage是一个去中心化的依赖管理器,它构建您的依赖项并提供二进制框架。
您可以使用以下命令使用Homebrew安装 Carthage
$ brew update
$ brew install carthage
要使用 Carthage 将 Alamofire 集成到您的 Xcode 项目中,在您的 Cartfile
中指定它
github "ThreeGayHub/SolarNetwork"
运行 carthage update
如果您是第一次在项目中使用Carthage,您需要按照在Carthage中说明的步骤进行一些额外操作。
使用方法
基本使用
目标
import SolarNetwork
struct HTTPBinTarget: SLTarget {
var baseURLString: String { return "https://httpbin.org" }
}
let HTTPBinNetwork = SLNetwork(HTTPBinTarget())
请求
import SolarNetwork
//Mark: - GET
class HTTPBinGETRequest: SLRequest {
override func loadRequest() {
super.loadRequest()
self.path = "/get"
}
}
HTTPBinNetwork.request(HTTPBinGETRequest()) { (response) in
if let dictionary = response.dataDictionary {
}
else if let error = response.error {
//show error
}
}
//Mark: - POST
class HTTPBinPOSTRequest: SLRequest {
override func loadRequest() {
super.loadRequest()
self.method = .post
self.path = "/post"
}
/**
properties will encode to parameters by Reflection
["userName": "myUserName",
"password": "myPassword",
"name" : "youName"]
*/
let userName = "myUserName"
let password = "myPassword"
var name: String?
}
let postReq = HTTPBinPOSTRequest()
postReq.name = "yourName"
HTTPBinNetwork.request(postReq) { (response) in
if let dictionary = response.dataDictionary {
}
else if let error = response.error {
//show error
}
}
下载
import SolarNetwork
class HTTPBinDownLoadRequest: SLDownloadRequest {
override func loadRequest() {
super.loadRequest()
self.path = "/image/png"
self.isResume = true //control the download request is resume or not, default is false
}
}
HTTPBinNetwork.download(HTTPBinDownLoadRequest(), progressClosure: { (progress) in
}) { (resposne) in
}
上传
import SolarNetwork
class HTTPBinUploadRequest: SLUploadRequest {
override func loadRequest() {
super.loadRequest()
self.path = "/post"
}
}
let uploadRequest = HTTPBinUploadRequest()
uploadRequest.data = data //data to upload
HTTPBinNetwork.upload(uploadRequest, progressClosure: { (progress) in
}) { (response) in
}
解码
在Swift 4中,您可以使用Codable。
import SolarNetwork
struct User: Decodable { //Swift 4 Codable
var id: Int
var name: String
var token: String
}
HTTPBinNetwork.request(UserRequest()) { (response) in
if let user = response.decode(to: User.self) {
}
else if let error = response.error {
//show error
}
}
许可证
Alamofire在MIT许可证下发布。有关详细信息,请参阅许可证。