NOTE: The repository containing the asynchronous variant of MicroExpress now lives at Noze.io. Images have been updated. This repository will eventually revert to the synchronous HTTP API variant.
A micro server framework on top of the Swift Server WG HTTP API.
Swift NIO: The Swift NIO version moved over MicroExpress/NIO. This is probably what you are looking for :-)
It adds an Express like API on top of the low level Swift Server WG HTTP API.
import MicroExpress
let app = Express()
app.get("/moo") { req, res, next in
try res.send("Muhhh")
}
app.get("/json") { _, res, _ in
try res.json([ "a": 42, "b": 1337 ])
}
app.get("/") { _, res, _ in
try res.send("Homepage")
}
app.listen(1337)
This package is part of the Always Right Institute's blog series about the Swift Server Workgroup's offical Swift HTTP API.
- Blog series:
- Part 1 Using the Swift Server API 0.1.0
- Part 2 µExpress
- Part 3 µExpress/NIO
Please checkout Part 3 of our blog series to learn what this is about. This is a tiny framework, for a more full featured, synchronous Express-like API in Swift, have a look at ExExpress (as used in ApacheExpress). Noze.io comes w/ an asynchronous variant (but is using Dispatch, not Swift NIO - stay tuned).
Micro Hello World in 5 minutes (or in 30s using the swift-xcode image below):
$ mkdir MicroHelloWorld && cd MicroHelloWorld
$ swift package init --type executable
Update Package.swift
to include the dependency:
// swift-tools-version:4.0
import PackageDescription
let package = Package(
name: "MicroHelloWorld",
dependencies: [
.package(url: "https://github.com/AlwaysRightInstitute/MicroExpress.git",
.branch("branches/swift-nio-lib"))
],
targets: [
.target(name: "MicroHelloWorld",
dependencies: [ "MicroExpress" ])
]
)
Change the main.swift
from print("Hello World")
into:
import MicroExpress
let app = Express()
app.get("/") { req, res, next in
res.send("Hello World")
}
app.listen(1337)
$ swift build
$ swift run
Done. Access via: http://localhost:1337/
Choose the easy way using the
swift-xcode
Swift NIO image,
or take the hard way and use swift package generate-xcodeproj
.
brew install swiftxcode/swiftxcode/swift-xcode-nio
swift xcode link-templates # <-- important!
- Create new project (Command-Shift-N or File/New/Project ...)
- choose macOS / Server / Swift NIO template
- check desired options
- build and run, and then have fun!
Important: This creates a few schemes in the Xcode project. Make sure to select the right one when building & running.
$ swift package generate-xcodeproj
Fetching ...
Cloning ...
Resolving ...
generated: ./MicroExpress.xcodeproj
$ open MicroExpress.xcodeproj
$ swift build
Fetching ...
Cloning ...
Resolving ...
Compile ...
Compile Swift Module ...
Compile Swift Module 'MicroExpress' (9 sources)
Linking ./.build/x86_64-apple-macosx10.10/debug/MicroExpress
$ docker run --rm \
-v "${PWD}:/src" \
-v "${PWD}/.docker.build:/src/.build" \
swift:4.0.3 \
bash -c 'cd /src && swift build'
Unable to find image 'swift:4.0.3' locally
4.0.3: Pulling from library/swift
8f7c85c2269a: Pull complete
...
9783e1c76d2b: Pull complete
Digest: sha256:6978675b95f749b54eab57163c663d45b25c431c6d50cb5b2983062a55cea3c6
Status: Downloaded newer image for swift:4.0.3
Compile ...
Compile Swift Module ...
Compile Swift Module 'MicroExpress' (9 sources)
Linking ./.build/x86_64-unknown-linux/debug/MicroExpress
Fetching ...
Cloning ...
Resolving ...
$ file .docker.build/x86_64-unknown-linux/debug/MicroExpress
.docker.build/x86_64-unknown-linux/debug/MicroExpress:
ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked ...
- Swift NIO
- Noze.io
- ExExpress
- JavaScript Originals
- Swift Apache
- Swiftmon/S
MicroExpress is brought to you by the Always Right Institute and ZeeZide. We like feedback, GitHub stars, cool contract work, presumably any form of praise you can think of.