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.
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
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
Add as a package dependency
.package(url: "https://github.com/TheRakiburKhan/RKAPIService.git", from: "3.0.0")
-
Import
RKAPIService
-
Create and instance of
RKAPIService
. Developer can also use the shared instance by typingRKAPIService.shared
-
Use
func fetchItemsByHTTPMethod(urlLink: URL?, httpMethod: HTTPMethod, body: Data?, additionalHeader: [HTTPHeader]?) async throws -> NetworkResult<Data>
for calling anyURLSession.dataTask
operations. This is a Throwing method. -
Use
func fetchItemsByHTTPMethod(urlLink: URL?, httpMethod: HTTPMethod, body: Data?, additionalHeader: [HTTPHeader]?) -> AnyPublisher<NetworkResult<Data>, Error>
for calling anyURLSession.dataTask
operations viaCombine
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.
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
}
}
}
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)
}
}
}
-
Import
RKAPIService
-
Create and instance of
RKAPIService
. Developer can also use the shared instance by typingRKAPIService.shared
-
Use
func fetchItems(urlLink: URL?, _ completion: @escaping (Result<NetworkResult<Data>, Error>)-> Void )
for calling anyURLSession.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 )
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)
}
}
}
}
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 anURL?
buildURL(string: String, filter: CharacterSet)
returns anURL?
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)
Rakibur Khan, contact me via email or visit my website
This package is licensed under MIT License. See the LICENSE file.
All changes are loggedd in CHANGELOG file.