NetworkSwift 0.0.9

NetworkSwift 0.0.9

Maintained by Hoang Nguyen.



  • By
  • Hoang Nguyen

NetworkSwift

NetworkSwift is a lightweight and dynamic networking library designed for versatility, supporting various session types, including URLSession. The library adheres to a defined contract, implementing three core functions:

  1. HTTPS Request: Facilitates making secure HTTP requests.
  2. Upload File: Supports the uploading of files.
  3. Download File: Enables the downloading of files.

NetworkSwift offers two distinct methods for executing requests:

  1. Completion Request: Utilizes completion handlers for handling responses.

  2. Async Await Request (iOS 15 above): Supports asynchronous programming through Swift's async/await mechanism.

Additionally, NetworkSwift includes a submodule called NetworkSwift/Queue. This submodule is specifically designed to handle auto re-authentication in cases where request credentials have expired.

To enhance testability, NetworkSwift provides mock implementations, allowing developers to write unit tests effectively.

Integration

Integration through CocoaPods

CocoaPods is a dependency manager for Swift projects and makes integration easier.

  1. If you don't have CocoaPods installed, you can do it by executing the following line in your terminal.

    sudo gem install cocoapods

  2. If you don't have a Podfile, create a plain text file named Podfile in the Xcode project directory with the following content, making sure to set the platform and version that matches your app.

    2.1. Application:

    pod 'NetworkSwift/Core'

    pod 'NetworkSwift/Queue'

    2.2. Testing:

    pod 'NetworkSwift/CoreMocks'

    pod 'NetworkSwift/QueueMocks'

  3. Install NetworkSwift by executing the following in the Xcode project directory.

    pod install

  4. Now, open your project workspace and check if NetworkSwift is properly added.

How to use

1. Request with Completion

    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. Request with async await for iOS-15 above

    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. Request with Queue and Re-Authentication

    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. Download file

    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. Upload file

   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. Mocking support unit test

  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. Handle result

  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)
    }
  }

Thats it!! NetworkSwift is successfully integrated and initialized in the project, and ready to use.

For more detail please go to Example project.

Support

Feel free to utilize mockapi.io for testing API in Networkit examples. If you encounter any issues with NetworkSwift or need assistance with integration, please reach out to me at [email protected]. I'm here to support you.