Giter VIP home page Giter VIP logo

rkapiservice's Introduction

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.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.