vapor3 swift server

4311 ワード

vapor swift server
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)
    }
}