Network service layer Combine REST API CRUD

Easy and lightweight network layer for creating different set of network requests like GET, POST, PUT, DELETE customizable with coders conforming to TopLevelDecoder
, TopLevelEncoder
Features
1. Environment
Define enum with interface IEnvironment
enum Environment: IEnvironment {
case development
case production
var baseURL: String {
switch self {
case .development: return "http://localhost:3000"
case .production: return "https://apple.com"
}
}
var headers: [IRequestHeader]? {
switch self {
case .development: return [ContentType.applicationJSON]
case .production: return [ContentType.textJSON]
}
}
var logger : ILogger? {
switch self {
case .development: return ServiceLogger()
case .production: return nil
}
}
}
All headers for a request have to conform to the interface IRequestHeader
The example implementation for content type headers is here ContentType.swift
Logger
You can use out of the box standard logger ServiceLogger if you don’t need some specific data from URLRequest and URLResponse or define your own with interface ILogger
2. API for endpoint
Define endpoint API enum
enum UserRestAPI {
case index
case read(id: Int)
case create
case update
case delete(id: Int)
}
Extend the enum with interface IRequest
field |
type |
route |
String |
method |
RequestMethod |
extension UserRestAPI: IRequest {
var route: String {
switch self {
case .index: return "/user"
case .read(let id): return "/user/\(id)"
case .create: return "/user"
case .update: return "/user"
case .delete(let id): return "/user/\(id)"
}
}
var method: RequestMethod {
switch self {
case .index: return .get
case .read(_): return .get
case .create: return .post
case .update: return .put
case .delete(_): return .delete
}
}
}
The example implementation is here UserRestAPI.swift
UserRestAPI.swift
3. Create network sevice
let network = NetworkService(environment: Environment.development)
execute
- Do request from the endpoint configuration GET, POST, PUT, DELETE
There are four methods are available currently GET, POST, PUT, DELETE
Parameters
Pass a [String: CustomStringConvertible] dictionary to the parameter that available for GET, POST, PUT requests. It’s an optional parameter.
Read
let cfg = UserRestAPI.read(id: 1)
let publisher: Output = network.execute(with: cfg, ["token" : 65678])
Create
let cfg = UserRestAPI.create
let user = Model(id: 11, name: "Igor")
let publisher: Output = network.execute(body: user, with: cfg)
Update
let cfg = UserRestAPI.update
let user = Model(id: 11, name: "Igor")
let publisher: Output = network.execute(body: user, with: cfg)
Delete
let cfg = UserRestAPI.delete(id: 11)
let publisher: Output = network.execute(with: cfg)
4. Managing requests
Chaining requests
let read: Output = network.execute(with: UserRestAPI.index)
let user = Model(id: 11, name: "Igor")
let create: Output = network.execute(body: user, with: UserRestAPI.create)
read.then(create)
// or chain it using predicate to analyze previous result
read.then(ifTrue : {$0.count > 1}, create)
Do in parallel infinite amount of requests
Collecting their results in Array and waiting until they are all done
All requests are expected the same output and failure
[read, create, delete, update, read, read ].doTogether
Mixing
First create and update requests as a group and then read
[create, update]
.waitEverybody
.then(read)
[create, delete]
.waitEverybody
.then([delete, read].doTogether)
Package installation
In Xcode - Select Xcode
>File
> Swift Packages
>Add Package Dependency...
and add https://github.com/The-Igor/d3-network-service
Try it in the real environment
Simple server installation (mocking with NodeJS Express)
To try it in the real environment. I suggest installing the basic NodeJS Express boilerplate. Take a look on the video snippet how easy it is to get it through Webstorm that is accessible for free for a trial period.

Real SwiftUI example
d3-rest-combine-swift-example
- Run server NodeJS Express
- Run SwiftUI project
Documentation(API)
- You need to have Xcode 13 installed in order to have access to Documentation Compiler (DocC)
- Go to Product > Build Documentation or ⌃⇧⌘ D
Network service layer Combine REST API CRUD
Easy and lightweight network layer for creating different set of network requests like GET, POST, PUT, DELETE customizable with coders conforming to
TopLevelDecoder
,TopLevelEncoder
Features
1. Environment
Define enum with interface IEnvironment
Request headers
All headers for a request have to conform to the interface IRequestHeader
The example implementation for content type headers is here ContentType.swift
Logger
You can use out of the box standard logger ServiceLogger if you don’t need some specific data from URLRequest and URLResponse or define your own with interface ILogger
2. API for endpoint
Define endpoint API enum
Extend the enum with interface IRequest
The example implementation is here UserRestAPI.swift UserRestAPI.swift
3. Create network sevice
execute
- Do request from the endpoint configuration GET, POST, PUT, DELETEThere are four methods are available currently GET, POST, PUT, DELETE
Parameters
Pass a [String: CustomStringConvertible] dictionary to the parameter that available for GET, POST, PUT requests. It’s an optional parameter.
Read
Create
Update
Delete
4. Managing requests
Chaining requests
Do in parallel infinite amount of requests
Collecting their results in Array and waiting until they are all done
Mixing
First create and update requests as a group and then read
Package installation
In Xcode - Select
Xcode
>File
>Swift Packages
>Add Package Dependency...
and add
https://github.com/The-Igor/d3-network-service
Try it in the real environment
Simple server installation (mocking with NodeJS Express)
To try it in the real environment. I suggest installing the basic NodeJS Express boilerplate. Take a look on the video snippet how easy it is to get it through Webstorm that is accessible for free for a trial period.
Real SwiftUI example
d3-rest-combine-swift-example
Documentation(API)