NetworkStack 0.1.7

NetworkStack 0.1.7

测试已测试
Lang语言 SwiftSwift
许可协议 Apache-2.0
发布上次发布2020年12月
SPM支持 SPM

Olivier HalligonRomain Rolland 维护。



 
依赖项
Alamofire~> 4.9
RxSwift~> 5.1
RxCocoa~> 5.1
KeychainAccess~> 4.2
 

NetworkStack

Language: Swift 4 CocoaPods compatible CocoaPods Twitter CocoaPods

NetworkStack 是一个包含 AlamofireRxOAuth 和重放机制的用于响应式抽象 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 许可 之下分发。