vapor3 swift server
4311 ワード
vapor swift server
vaporはswiftで作成されたwebframworkで、macOSとUbuntuに適しており、簡潔で効率的なweb serverライブラリを提供しています
Getting Started
Vapor Toolboxによる
AppはControllersとModels層起動ファイルmianに分けられる.swift
vaporはswiftで作成されたwebframworkで、macOSとUbuntuに適しており、簡潔で効率的なweb serverライブラリを提供しています
Getting Started
Vapor Toolboxによる
brew install vapor/tap/vapor
のインストール// vapor-cli hello
vapor new hello
cd Hello
// open xcode
vapor xcode
// runing
// Server starting on http://localhost:8080
vapor build
vapor run
SPMによる構築import PackageDescription
let package = Package(
name: "VaporApp",
dependencies: [ ... ],
targets: [
.target(name: "App", dependencies: ["Vapor"]),
.target(name: "Run", dependencies: ["App"]),
.testTarget(name: "AppTests", dependencies: ["App"]),
]
)
jsonファイル構成// severs.json
{
"http": {
"host": "0.0.0.0", //
"port": 80 // 80 API
}
}
// mysql.json
{
"hostname": "127.0.0.1",
"user": "",
"password": "",
"database": "",
"encoding": "utf8mb4",
"port": "3306"
}
例AppはControllersとModels層起動ファイルmianに分けられる.swift
import App
try app(.detect()).run()
app.swiftファイルはApp全体のプロファイルであり、Config、Environment、Servicesの構成、およびApplicationの起動を含むpublic func app(_ env: Environment) throws -> Application {
var config = Config.default()
var env = env
var services = Services.default()
try configure(&config, &env, &services)
let app = try Application(config: config, environment: env, services: services)
try boot(app)
return app
}
Controllerで関連する論理処理を行い、routerで構成する// TodoController
final class TodoController {
/// Returns a list of all `Todo`s.
func index(_ req: Request) throws -> Future {
return Todo.query(on: req).all()
}
/// Saves a decoded `Todo` to the database.
func create(_ req: Request) throws -> Future {
return try req.content.decode(Todo.self).flatMap { todo in
return todo.save(on: req)
}
}
}
// Todo Model orm
final class Todo: SQLiteModel {
var id: Int?
var title: String
init(id: Int? = nil, title: String) {
self.id = id
self.title = title
}
}
义齿public func routes(_ router: Router) throws {
// Controller
let todoController = TodoController()
//
router.post("todos", use: todoController.create)
//
router.delete("todos", Todo.parameter, use: todoController.delete)
}
configure構成項目// services ,router,middlewareConfig,Database,MigrationConfig
public func configure(_ config: inout Config, _ env: inout Environment, _ services: inout Services) throws {
/// Register providers first
try services.register(FluentSQLiteProvider())
/// Register routes to the router
let router = EngineRouter.default()
try routes(router)
services.register(router, as: Router.self)
/// Register middleware
var middlewares = MiddlewareConfig() // Create _empty_ middleware config
/// middlewares.use(FileMiddleware.self) // Serves files from `Public/` directory
middlewares.use(ErrorMiddleware.self) // Catches errors and converts to HTTP response
services.register(middlewares)
// Configure a SQLite database
let sqlite = try SQLiteDatabase(storage: .memory)
/// Register the configured SQLite database to the database config.
var databases = DatabasesConfig()
databases.add(database: sqlite, as: .sqlite)
services.register(databases)
/// Configure migrations
var migrations = MigrationConfig()
migrations.add(model: Todo.self, database: .sqlite)
services.register(migrations)
}
Providerプロバイダ// Provider
public final class MyProvider:Provider {
public func boot(_ worker: Container) throws {}
public func didBoot(_ worker: Container) throws -> Future {
return .done(on: worker)
}
public func register(_ services: inout Services) throws {
services.register(MyClient.self)
}
}