Easy and lightweight network layer for creating different set of network requests like GET, POST, PUT, DELETE customizable with coders conforming to TopLevelDecoder
, TopLevelEncoder
- Stand alone package without any dependencies using just Apple's Combine facilities
- Error handling from forming URLRequest object to getting data on a subscription
- Customizable for different environments development, production...
- Customizable for different requests schemes from classic CRUD Rest to what suits to your own custom routes
- Based on interfaces not implementations
- Ability to log and customize logers for different environment
- Ability to chain requests layering with predicate logic analyzing previous result
- Do in parallel infinite amount of requests collecting their results in Array and waiting until they are all done
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
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
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
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
Pass a [String: CustomStringConvertible] dictionary to the parameter that available for GET, POST, PUT requests. It's an optional parameter.
let cfg = UserRestAPI.read(id: 1) let publisher: Output = network.execute(with: cfg, ["token" : 65678])
let cfg = UserRestAPI.create let user = Model(id: 11, name: "Igor") let publisher: Output = network.execute(body: user, with: cfg)
let cfg = UserRestAPI.update let user = Model(id: 11, name: "Igor") let publisher: Output = network.execute(body: user, with: cfg)
let cfg = UserRestAPI.delete(id: 11) let publisher: Output = network.execute(with: cfg)
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)
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
First create and update requests as a group and then read
[create, update] .waitEverybody .then(read) [create, delete] .waitEverybody .then([delete, read].doTogether)
In Xcode - Select Xcode
>File
> Swift Packages
>Add Package Dependency...
and add https://github.com/The-Igor/d3-network-service
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.
Server instalation (NodeJS Express)
- Get WebStorm Early Access
- Get index.js file from here and replace it with the one in the boilerplate and launch the server.
- Run server NodeJS Express
- Run SwiftUI project
- You need to have Xcode 13 installed in order to have access to Documentation Compiler (DocC)
- Go to Product > Build Documentation or ⌃⇧⌘ D