RKAPIService

3.0.0

RKAPIService is a simple and handy API Service utilizes swift concurrency aka async/await
TheRakiburKhan/RKAPIService

What's New

Multipart/formdata added

2023-06-19T06:26:15Z

Added

  • ContentType enum added for HTTP ContentType. It can be used in additionalHeader parameter of a request.
  • Added support for attachment upload as multipart/formdata as request body

Fixed

  • Resolved infinite loop problem

RKAPIService

Coding time tracker Platforms Support License Swift Package Manager Cocoapod Carthage Swift Version iOS Version macOS Version watchOS Version tvOS Version

RKAPIService uses Combine publishers or Swift's native concurrency "async/await" and performs simple Restful API operations. Apple offers URLSession async/await API's only above iOS 15.0, macOS 12.0, watchOS 8.0 and tvOS 15.0 but swift concurrency is supported from iOS 13.0, macOS 10.15, watchOS 6.0 and tvOS 13.0. RKAPIService let's developer utilize those URLSession async/await operations down to iOS 13.0, macOS 10.15, watchOS 6.0 or tvOS 13.0

N.B: Currently we support URLSession.dataTask only. Rest is coming soon.

Table of Contents

System Requirments

RKAPIService requires

  • iOS 11.0 or above
  • macOS 10.13 or above
  • watchOS 4.0 or above
  • tvOS 11.0 or above
  • XCode 12.0 or above

Installations

RKAPIService is available through Swift Package Manager. To install it, simply follow the steps:

  • In Xcode, select File > Swift Packages > Add Package Dependency.
  • Follow the prompts using the URL for this repository
https://github.com/TheRakiburKhan/RKAPIService.git
  • Select the RKAPIService - prefixed libraries you want to use

OR

Add as a package dependency

.package(url: "https://github.com/TheRakiburKhan/RKAPIService.git", from: "3.0.0")

Usage

For iOS 13.0+, macOS 10.15+, watchOS 6.0+ or tvOS 13.0+

  • Import RKAPIService

  • Create and instance of RKAPIService. Developer can also use the shared instance by typing RKAPIService.shared

  • Use func fetchItemsByHTTPMethod(urlLink: URL?, httpMethod: HTTPMethod, body: Data?, additionalHeader: [HTTPHeader]?) async throws -> NetworkResult<Data> for calling any URLSession.dataTask operations. This is a Throwing method.

  • Use func fetchItemsByHTTPMethod(urlLink: URL?, httpMethod: HTTPMethod, body: Data?, additionalHeader: [HTTPHeader]?) -> AnyPublisher<NetworkResult<Data>, Error> for calling any URLSession.dataTask operations via Combine Publishers. This is non Throwing method.

  • If the developer want's to do simple HTTP GET request then there is another dedicated API for that, func fetchItems(urlLink: URL?, additionalHeader: [HTTPHeader]?) async throws -> NetworkResult<Data>. This is a Throwing method.

If the developer want's to do simple HTTP GET request then there is another dedicated API for that, func fetchItems(urlLink: URL?, additionalHeader: [HTTPHeader]?) -> AnyPublisher<NetworkResult<Data>, Error>. This is non Throwing method.

Example with async/await

import Foundation
import RKAPIService

final class DataFetchService {
    let apiService = RKAPIService.shared
    
    //If you want to use any type of HTTP Request
    func fetchDataWithBody(url: URL?, method: HTTPMethod, body: Data?, additionalHeader: [HTTPHeader]?) async {
        do {
            let reply = try await apiService.fetchItemsByHTTPMethod(urlLink: url, httpMethod: method, body: body, additionalHeader: additionalHeader)
            
            //Handle your data and response code however you like

            //Printing Optional<Data>
            debugPrint(reply.data)

            //Printing HTTPStatusCode
            debugPrint(reply.response)

        } catch(let error) {
            // Handle any exception or Error
        }
    }

    // If you want to use HTTP Get Request only
    func fetchData(url: URL?, additionalHeader: [HTTPHeader]?) async {
        do {
            let reply = try await apiService.fetchItems(urlLink: url, additionalHeader: additionalHeader)
            
            //Handle your data and response code however you like

            //Printing Optional<Data>
            debugPrint(reply.data)

            //Printing HTTPStatusCode
            debugPrint(reply.response)

        } catch(let error) {
            // Handle any exception or Error
        }
    }
}

Example with Combine Publisher

import Foundation
import Combine
import RKAPIService

final class DataFetchService {
    let apiService = RKAPIService.shared
    let cancellable = Set<AnyCancellable>()
    
    //If you want to use any type of HTTP Request
    func fetchDataWithBody(url: URL?, method: HTTPMethod, body: Data?, additionalHeader: [HTTPHeader]?) {
        apiService.fetchItemsByHTTPMethod(urlLink: url, httpMethod: method, body: body, additionalHeader: additionalHeader)
        //Receiving on Main Thread
            .receive(on: DispatchQueue.main)
            .sink { reply in
                switch reply {
                    case .finished:
                        // After finishing a successful call
                        break
                    case .failure(let error):
                        // Handle any exception or Error
                        break
                }
            } receiveValue: { result in
                //Handle your data and response code however you like
                
                //Printing Optional<Data>
                debugPrint(result.data)
                
                //Printing HTTPStatusCode
                debugPrint(result.response)
            }
        
    }
    
    // If you want to use HTTP Get Request only
    func fetchData(url: URL?, additionalHeader: [HTTPHeader]?) {
        apiService.fetchItems(urlLink: url, additionalHeader: additionalHeader)
        //Receiving on Main Thread
            .receive(on: DispatchQueue.main)
            .sink { reply in
                switch reply {
                    case .finished:
                        // After finishing a successful call
                        break
                    case .failure(let error):
                        // Handle any exception or Error
                        break
                }
            } receiveValue: { result in
                //Handle your data and response code however you like
                
                //Printing Optional<Data>
                debugPrint(result.data)
                
                //Printing HTTPStatusCode
                debugPrint(result.response)
            }
    }
}

For iOS 11.0+ and macOS 10.10+

  • Import RKAPIService

  • Create and instance of RKAPIService. Developer can also use the shared instance by typing RKAPIService.shared

  • Use func fetchItems(urlLink: URL?, _ completion: @escaping (Result<NetworkResult<Data>, Error>)-> Void ) for calling any URLSession.dataTask operations. This is a Throwing method

  • If the developer want's to do simple HTTP GET request then there is another dedicated API for that, func fetchItemsByHTTPMethod(urlLink: URL?, httpMethod: HTTPMethod, body: Data?, _ completion: @escaping (Result<NetworkResult<Data>, Error>)-> Void )

Example

import Foundation
import RKAPIService

final class DataFetchService {
    let apiService = RKAPIService.shared
    
    //If you want to use any type of HTTP Request
    func fetchDataWithBody(url: URL?, method: HTTPMethod, body: Data?, additionalHeader: [HTTPHeader]?) {
        apiService.fetchItemsByHTTPMethod(urlLink: url, httpMethod: method, body: body, additionalHeader: additionalHeader) { result in
            switch result {
                case .success(let reply):
                    //Handle your data and response code however you like
                    
                    //Printing Optional<Data>
                    debugPrint(reply.data)
                    
                    //Printing HTTPStatusCode
                    debugPrint(reply.response)
                    
                case .failure(let error):
                    // Handle any exception or Error
                    debugPrint(error)
                    
            }
        }
    }

    // If you want to use HTTP Get Request only
    func fetchData(url: URL?, additionalHeader: [HTTPHeader]?) {
         apiService.fetchItems(urlLink: url, additionalHeader: additionalHeader) { result in
            switch result {
                case .success(let reply):
                    //Handle your data and response code however you like
                    
                    //Printing Optional<Data>
                    debugPrint(reply.data)
                    
                    //Printing HTTPStatusCode
                    debugPrint(reply.response)
                    
                case .failure(let error):
                    // Handle any exception or Error
                    debugPrint(error)
                    
            }
        }
    }
}

Helper

When working with network communication, URL is the primary component. A simple URLBuilder is included with this package to build URL properly and effortlessly.

  • buildURL(scheme: String, baseURL: String, portNo: Int?, path: String?, queries: [URLQueryItem]?) returns an URL?
  • buildURL(string: String, filter: CharacterSet) returns an URL?

Example

Here is an exapmple of building simple url of Swift Pacakge Manager page link.

RKAPIHelper.buildURL(scheme: "https", baseURL: "swift.org", portNo: nil, path: "/package-manager", queries: nil)

RKAPIHelper.buildURL(string: "https://swift.org/package-manager", filter: .urlQueryAllowed)

Author

Rakibur Khan, contact me via email or visit my website

License

This package is licensed under MIT License. See the LICENSE file.

Changelog

All changes are loggedd in CHANGELOG file.

Description

  • Swift Tools 5.5.0
View More Packages from this Author

Dependencies

  • None
Last updated: Fri Apr 19 2024 19:55:07 GMT-0900 (Hawaii-Aleutian Daylight Time)