Lightweight, stateless REST network manager over the Codable protocol built upon Alamofire.
To learn more aboit this library, check out the documentation.
- iOS 10.0+ / macOS 10.12+
- XCode 11.4+
- Swift 5.2+
- Codable support.
- PromiseKit wrapper.
- RxSwift wrapper.
- Automatic request parameter serialization (Codable?)
Add RestBird as a dependency to your project.
.package(url: "https://github.com/Alamofire/Alamofire.git", from: "0.5")
Then, simply integrate RestBird with your target.
targets: [
Target(name: "YourTarget", dependencies: ["RestBird"])
]
pod 'RestBird'
You can also try it out by running
pod try RestBird
github "halcyonmobile/RestBird"
Steps for setting up the project for development:
- Clone the repo
- Generate Xcode project by executing
swift package generate-xcodeproj
- Open project
First you need to create your NetworkClientConfiguration
configuration with your custom or one of the provided session manager drivers. We're going to use the AlamofireSessionManager.
struct MainAPIConfiguration: NetworkClientConfiguration {
let baseUrl = "https://api.example.com"
let sessionManager = AlamofireSessionManager()
let jsonEncoder = JSONEncoder()
let jsonDecoder = JSONDecoder()
}
Now we can pass this configuration to the network client.
let networkClient = NetworkClient(configuration: MainAPIConfiguration())
In order to make requests, a DataRequest
object should be defined.
struct SignIn: DataRequest {
typealias ResponseType = Authentication
let email: String
let password: String
let suffix: String? = API.Path.login
let method: HTTPMethod = .post
var parameters: [String : Any]? {
return [API.Param.email: email, API.Param.password: password]
}
}
Now use your network client to execute requests.
let request = SignIn(email: "john-doe@acme.inc", password: "123456")
networkClient.execute(request: request, completion: { result: Result<Authentication> in
print(result)
})
Middlewares are a powerful way to intercept network requests or react to the response the endpoint returns.
At the moment, middlewares fall under two categories:
- Pre Middlewares (evaluated before the request is about to be executed)
- Post Middlewares (evaluated after the request was executed)
struct LoggerMiddleware: PreMiddleware {
func willPerform(_ request: URLRequest) throws {
Logger.log(resquest)
}
}
struct ErrorMiddleware: PostMiddleware {
func didPerform(_ request: URLRequest, response: URLResponse, data: Data?) throws {
if let data = data, let error = ErrorProvider.provide(for: data) {
throw error
}
}
}
// Register middleware
networkClient.register(LoggerMiddleware())
networkClient.register(ErrorMiddleware())
To avoid writing boilerplate code for network classes, we wrote a couple of templates to generate code using Sourcery. Head over to the template repository.
Here's how two requests would look like using the templates:
/// sourcery: Service
protocol PostService {
/// sourcery: path = /posts/\(id)
/// sourcery: pathParam = id
func get(id: String, completion: (result: Result<Post>) -> Void)
/// sourcery: method = post, path = /posts
/// sourcery: parameter = post
/// sourcery: parameter = json
func save(post: Post, completion: (result: Result<Post>) -> Void)
}
You can find convenience wrappers for RestBird which are not distributed through the package. This includes a PromiseKit and an RxSwift wrapper.
Check out here.
RestBird is released under the MIT license. See LICENSE for details.
If you use the open-source library in your project, please make sure to credit and backlink to http://halcyonmobile.com