blackfish - 一个快速的HTTP web服务器基于Node.js和Express采用Swift开发
Blackfish
blackfish - 一个快速的HTTP web服务器基于Node.js和Express采用Swift开发。可用于iOS, OS X, 和Ubuntu.
- Insanely fast
- Single Threaded
- Beautiful syntax
- Type safe
Getting Started
You must have Swift 2.2 or later installed. You can learn more about Swift 2.2 at Swift.org
Work in Progress
This is a work in progress and will likely change frequently, pull requests are welcome!
Server
Starting the server is as simple as express.
main.swift
import Blackfish let app = Blackfish() app.get("/") { request, response in response.send(text: "Hello World!") } app.listen(port: 3000) { error in if error == nil { print("Example app listening on port 3000") } }
If you are having trouble connecting, make sure your ports are open. Check out apt-get ufw
for simple port management.
Routing
Routing in Blackfish is simple and very similar to Express.
main.swift
app.get("/welcome") { request, response in response.send(text: "Hello") } app.post('/') { request, response in response.send(text: 'Got a POST request') }); //...start server
Router
You can also create a Router object which will allow you to define multiple routes with a prefix.
let router = Router() router.get("/") { request, response in response.send(text: "Bird is the word") } router.get("/about") { request, response in response.send(text: "Don't you know, about the bird?") } app.use(path: "/birds", router: router) // ...start server
Navigating to http://example.com/birds
will show a page with Bird is the word
and navigating to http://example.com/birds/about
will show a page with "Don't you know, about the bird?"
.
JSON
Responding with JSON is easy.
app.get("version") { request, response in response.send(json: ["version": "1.0"]) }
This responds to all requests to http://example.com/version
with the JSON dictionary {"version": "1.0"}
and Content-Type: application/json
.
Views
You can also respond with HTML pages.
app.get("/") { request, response in response.render("index.html") }
Just put the file in the Resources
folder at the root of your project and it will be served.
Response
A manual response can be returned if you want to set something like cookies
.
Route.get("cookie") { request, response in response.status = .OK response.text = "Cookie was set" response.cookies["test"] = "123" response.send() }
The Status enum above (.OK
) can be one of the following.
public enum Status { case OK, Created, Accepted case MovedPermanently case BadRequest, Unauthorized, Forbidden, NotFound case ServerError case Unknown case Custom(Int) }
Or something custom.
let status: Status = .Custom(420) //https://dev.推ter.com/overview/api/response-codes
Public
All files put in the Public
folder at the root of your project will be available at the root of your domain. This is a great place to put your assets (.css
, .js
, .png
, etc).
Request
Every route call gets passed a Request
object. This can be used to grab query and path parameters.
This is a list of the properties available on the request object.
let method: Method var parameters: [String: String] //URL parameters like id in user/:id var data: [String: String] //GET or POST data var cookies: [String: String] var session: Session
Middleware
Similar to Express, Blackfish provides Middleware which can be used to extend the request stack.
Below is an example of a validation Middleware, that validates every request before passing it down the stack.
let validator = Middleware { (request, response, next) in // Some validation logic if validator.validate(request) { // Go to the next call in the stack. next() } else { // Return an error and don't call anything else in the stack. response.send(error: "Request was unauthorized") } }
You can also use middleware on a path which will add it to that path and further on.
let userDetail = Middleware(path: "/user") { (request, response, next) in { let user = findUserById(request.data["userId"]) request.data["user"] = user next() }
Using Middleware can allow you endless possibilities with a simple interface.
Session
Sessions will be kept track of using the blackfish-session
cookie. The default (and currently only) session driver is .Memory
.
if let name = request.session.data["name"] { //name was in session } //store name in session request.session.data["name"] = "Blackfish"
Deploying
Vapor has been successfully tested on Ubuntu 14.04 LTS (DigitalOcean) and Ubuntu 15.10 (VirtualBox).
To deploy to DigitalOcean, simply
- Install Swift 2.2
wget
the .tar.gz from Apple- Set the
export PATH
in your~/.bashrc
- (you may need to install
binutils
as well if you seear not found
)
- Set Blackfish as a dependency of your project in your Package.swift
swift dependencies:[ // ...Previous dependencies .Package(url: "https://github.com/elliottminns/blackfish", majorVersion: 0) ]
cd
into the repository- Run
swift build
- Run
.build/debug/MyApp
- (you may need to run as
sudo
to use certain ports) - (you may need to install
ufw
to set appropriate ports) </ul> </li> </ul>
Attributions
This project is based on Vapor by Tanner Nelson. It uses compatibilty code from NSLinux by johnno1962.
Go checkout and star their repos.
- Run