NetworkSwift 0.0.9

NetworkSwift 0.0.9

Hoang Nguyen 维护。



  • 作者:
  • Hoang Nguyen

NetworkSwift

NetworkSwift 是一个轻量级且动态的网络库,旨在实现通用性,支持多种会话类型,包括 URLSession。该库遵循定义的合同,实现了三个核心功能

  1. HTTPS 请求:便于发出安全的 HTTP 请求。
  2. 上传文件:支持上传文件。
  3. 下载文件:允许下载文件。

NetworkSwift 提供了两种不同的请求执行方法

  1. 完成请求:使用完成处理程序来处理响应。

  2. Async Await 请求(iOS 15 及以上):支持通过 Swift 的 async/await 机制进行异步编程。

此外,NetworkSwift 包含一个名为 NetworkSwift/Queue 的子模块。此子模块专门设计用于处理请求凭据过期时的自动重新认证。

为了提高可测试性,NetworkSwift 提供了模拟实现,使开发者能够有效地编写单元测试。

集成

通过 CocoaPods 集成

CocoaPods 是用于 Swift 项目的依赖管理器,使集成更为简单。

  1. 如果您还没有安装 CocoaPods,可以通过在终端执行以下行来安装:

    sudo gem install cocoapods

  2. 如果您没有 Podfile 文件,请在 Xcode 项目目录中创建一个名为 Podfile 的纯文本文件,并添加以下内容,确保设置的平台和版本与您的应用程序相匹配。

    2.1 应用程序

    pod 'NetworkSwift/Core'

    pod 'NetworkSwift/Queue'

    2.2 测试

    pod 'NetworkSwift/CoreMocks'

    pod 'NetworkSwift/QueueMocks'

  3. 在 Xcode 项目目录中执行以下命令以安装 NetworkSwift。

    pod install

  4. 现在,打开您的项目工作空间,检查 NetworkSwift 是否已正确添加。

如何使用

1. 发送带完成的请求

    let credentialContainer = ClientCredentialContainer()
    let service = NetworkKitImpWrapper(baseURL: baseURL, credentialContainer: credentialContainer)
    let request = NetworkRequestImp<[User]>(path: "/users", method: .GET)
    service.request(request) { result in
        self.handleResult(result)
    }

2. iOS-15及以上使用 async/await 发送请求

    do {
        let credentialContainer = ClientCredentialContainer()
        let service = NetworkKitImpWrapper(baseURL: baseURL, credentialContainer: credentialContainer)
        let request = NetworkRequestImp<User>(path: "/users/6", method: .DELETE)
        let result: NetworkRequestImp<User>.SuccessType = try await service.request(request)
        debugPrint("Request success: \(result)")
    } catch {
        debugPrint((error as? NetworkError)?.localizedDescription ?? error.localizedDescription)
    }

3. 使用队列和重新认证发送请求

    let credentialContainer = ClientCredentialContainer()
    let reAuthService = ClientReAuthenticationService(credentialContainer: credentialContainer)
    let networkKitQueue = NetworkKitQueueImp(baseURL: baseURL,
                                             credentialContainer: credentialContainer,
                                             reAuthService: reAuthService)
    let request = NetworkRequestImp<User>(path: "/users/1", method: .PUT)
    networkKitQueue.request(request) { result in
        self.handleResult(result)
    }

4. 下载文件

    let downloadDelegate = ClientDownloadDelegate()
    let session = URLSession(configuration: .default, delegate: downloadDelegate, delegateQueue: nil)
    let downloadService = NetworkKitImpWrapper(baseURL: baseURL, session: session)
    let request = NetworkRequestImp<User>(path: "/users/2", method: .POST)
    downloadService.downloadFile(request) { result in
        self.handleResult(result)
    }

5. 上传文件

   let uploadDelegate = ClientUploadDelegate()
   let session = URLSession(configuration: .default, delegate: uploadDelegate, delegateQueue: nil)
   let uploadService = NetworkKitImpWrapper(baseURL: baseURL, session: session)
   let request = NetworkRequestImp<User>(path: "/users/2", method: .POST)
   uploadService.uploadFile(request, fromFile: URL(fileURLWithPath: "")) { result in
     self.handleResult(result)
   }

6. 模拟支持单元测试

  let successResult = NetworkKitResultMock.requestSuccess(
    NetworkResponseMock(statusCode: 200, response: [User(id: "1", name: "Hoang")])
  )
  let session = NetworkSessionMock<User>(expected: successResult)
  let service = NetworkKitImpWrapper<NetworkSessionMock>(baseURL: baseURL, session: session)
  let request = NetworkRequestImp<[User]>(path: "/users", method: .GET)
  service.request(request) { result in
    self.handleResult(result)
  }

7. 处理结果

  private func handleResult<T>(
    _ result: Result<T, NetworkError>
  ) {
    switch result {
      case let .success(model):   debugPrint("Request success: \(model)")
      case let .failure(error):   debugPrint(error.localizedDescription)
    }
  }

完成啦!!NetworkSwift 已经成功集成并初始化到项目中,并可使用。

更多详情请访问 示例项目

支持

请随意使用 mockapi.io 在 Networkit 示例中进行 API 测试。如果在 NetworkSwift 遇到任何问题或需要帮助进行集成,请通过 [email protected] 联系我。我在这里支持你。