NetworkStack
NetworkStack
是一个包含 Alamofire、Rx、OAuth
和重放机制的用于响应式抽象 API 的网络库。
特色功能
此库有以下特性
- 将网络调用封装成与 RxSwift 兼容的 API,返回
Observable<T>
值,而不是使用完成块 - 处理 OAuth 认证工作流,允许您指定凭证(存储在 Keychain 中),并让库使用它们来增强您的已认证请求
- 在出现 401 认证错误时处理自动重试
- 允许您执行 refreshToken 请求,然后自动重放请求
- 允许您在需要从用户那里获取凭证时(如果 refreshToken 无效或不可用),显示任意的登录界面
- 简化了 API,以便您的 WebService 客户端在需要发送请求时有一个简单(且不依赖于 Alamofire)的 API 来调用,而无需担心内部实现。
安装
CocoaPods
使用CocoaPods是推荐的方式
- 在您的Podfile中,添加
use_frameworks!
和NetworkStack
到您的main和test目标。 - 运行
pod repo update
以让CocoaPods了解最新的NetworkStack
版本。 - 只需在您的
Podfile
中添加pod 'NetworkStack'
。
pod 'NetworkStack'
从命令行运行pod install
文档与使用示例
我们有一个特定的Wiki。如果您想实现高级或特定的行为,它将很有帮助。
简单使用
设置
let baseStringURL = "http://networkstack.fr/api/v1"
let keychainService: KeychainService = KeychainService(serviceType: "com.networkstack.keychain")
let networkStack = NetworkStack(baseURL: baseStringURL, keychainService: keychainService)
您可以通过多种方式自定义您的请求。请随意创建自己的SessionManager
以更改NetworkStack
内部请求的行为。NetworkStack
有两个可设置的属性:
- requestManager: 默认为
Alamofire.SessionManager
,即Alamofire.SessionManager()
- uploadManager: 默认为
nil
作为可路由协议的路由
NetworkStack
具有创建请求端点路径的Routable
协议。
public struct Route: Routable {
public let path: String
init(path: String) { self.path = path }
}
extension Route: CustomStringConvertible {
public var description: String { return path }
}
extension Route {
public static func authent() -> Route { return Route(path: "/authent") }
}
这是一个实现示例,但您可以根据需要自由使用它。
请求参数
这是请求创建的核心。请求参数可以包含
RequestParameters
:
- 方法:
Alamofire.HTTPMethod
- 路由:
Routable
- 需要授权:
Bool = false
- 参数:
Alamofire.Parameters? = nil
- 参数编码:
Alamofire.ParameterEncoding = JSONEncoding.default
- 头部信息:
Alamofire.HTTPHeaders? = nil
let requestParameters = RequestParameters(method: .get,
route: Route.authent(),
parameters: nil, // [String: Any] type
needsAuthorization: false,
parametersEncoding: URLEncoding.httpBody,
headers: nil) // [String: String] type
*上传时: UploadRequestParameters
- 方法:
Alamofire.HTTPMethod = .post
- 路由:
Routable
- 需要授权:
Bool = true
- 上传文件:
[UploadRequestParametersFile]
- 参数:
Alamofire.Parameters? = nil
- 头部信息:
Alamofire.HTTPHeaders? = nil
请求
在公开接口中,您可以找到一些帮助您发送请求的方法。
func sendRequestWithDataResponse(requestParameters: RequestParameters) -> Observable<(HTTPURLResponse, Data)>
func sendRequestWithJSONResponse(requestParameters: RequestParameters) -> Observable<(HTTPURLResponse, Any)>
// For Uploads
func sendUploadRequestWithDataResponse(uploadRequestParameters: UploadRequestParameters) -> Observable<(HTTPURLResponse, Data)>
func sendUploadRequestWithDataResponse(uploadRequestParameters: UploadRequestParameters) -> Observable<(HTTPURLResponse, Any)>
func sendBackgroundUploadRequest(uploadRequestParameters: UploadRequestParameters) -> Observable<URLSessionTask>
发送请求和响应
networkStack.sendRequestWithJSONResponse(requestParameters: requestParameters)
.subscribe({ (event: Event<(HTTPURLResponse, Any)>) in
switch event {
case .next(let json):
// do something with the json response or statusCode
break
case .error(let error):
// do something with NetworkStackError
break
case .completed:
// do something when observable completed
break
}
}).addDisposableTo(self.disposeBag)
错误
网络堆栈提供了几个错误,您可以在应用程序中处理这些错误。
public enum NetworkStackError: Error {
/// No internet, roaming off, data not allowed, call active, …
case noInternet(error: Error)
/// DNS Lookup failed, Host unreachable, …
case serverUnreachable(error: Error)
/// Invalid request, Fail to parse JSON, Unable to decode payload…
case badServerResponse(error: Error)
/// Response in 4xx-5xx range
case http(httpURLResponse: HTTPURLResponse, data: Data?)
/// Fail to parse response
case parseError
/// Other, unclassified error
case otherError(error: Error)
/// Request building has failed
case requestBuildFail
/// Upload manager has not been setup
case uploadManagerIsNotSet
/// Unknown
case unknown
}
更多示例 & 帮助主题
我们有一些示例
反馈
- 如果您发现了 bug ,请提交一个 问题
- 如果您有 功能请求 ,请提交一个 问题
- 如果您想 贡献 ,提交一个 pull request
许可
此代码在 Apache 2 许可 之下分发。