Contents

therakiburkhan/rkapiservice

`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

Table of Contents

- For iOS 13.0+, macOS 10.15+, watchOS 6.0+ or tvOS 13.0+ - For iOS 11.0+ and macOS 10.13+

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

``` Swift
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

``` Swift
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

``` Swift
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.

Package Metadata

Repository: therakiburkhan/rkapiservice

Default branch: main

README: README.md