Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Swift Server with Vapor

Stéphane G.
November 25, 2016

Swift Server with Vapor

I have tried Vapor, a server side swift project and I have presented it to my coworkers and this is my presentation.

Stéphane G.

November 25, 2016
Tweet

More Decks by Stéphane G.

Other Decks in Programming

Transcript

  1. Performance are great 0 50 GO Swift Java Node.js PHP

    CPU (Second) Memory (Kb) 41,23 15,78 4,26 3,97 3,96 http://benchmarksgame.alioth.debian.org/u64q/performance.php?test=spectralnorm
  2. Performance are great 0 50 GO Swift Java Node.js PHP

    CPU (Second) Memory (Kb) 17,10 27,16 32,24 14,60 2,41 41,23 15,78 4,26 3,97 3,96 http://benchmarksgame.alioth.debian.org/u64q/performance.php?test=spectralnorm
  3. Get Started ! $ ~/> mkdir TestVapor && cd TestVapor

    $ ~/TestVapor/> swift package init --type executable Creating library package: TestVapor ├── Package.swift ├── Sources │ └── main.swift └── Tests
  4. $ ~/> vapor new Hello Cloning Template [Done] ├── Sources

    │ └── App │ └── Controllers │ └── Middleware │ └── Models │ └── main.swift ├── Public ├── Resources │ └── Views └── Package.swift Get Started ! $ ~/> mkdir TestVapor && cd TestVapor $ ~/TestVapor/> swift package init --type executable Creating library package: TestVapor ├── Package.swift ├── Sources │ └── main.swift └── Tests
  5. Package Manager // Package.swift import PackageDescription let package = Package(

    name: "TestVapor", dependencies: [ .Package(url: "https://github.com/vapor/ vapor.git", majorVersion: 1, minor: 0) ] )
  6. Package Manager // Package.swift import PackageDescription let package = Package(

    name: "TestVapor", dependencies: [ .Package(url: "https://github.com/vapor/ vapor.git", majorVersion: 1, minor: 0) ] ) $ swift build Cloning https://github.com/vapor/vapor.git $ swift package generate-xcodeproj generated: ./TestVapor.xcodeproj
  7. Routing " // Main.swift import Vapor let drop = Droplet()

    drop.get("/hello") { _ in return "Hello Vapor" } drop.run()
  8. Return JSON // Main.swift import Vapor let drop = Droplet()

    drop.get("hello" , String.self) { request, name in return try JSON(node: [ "message" : "\(name)" ]) } drop.run()
  9. Return JSON // Main.swift import Vapor let drop = Droplet()

    drop.get("hello" , String.self) { request, name in return try JSON(node: [ "message" : "\(name)" ]) } drop.run()
  10. Parse JSON // Main.swift import Vapor let drop = Droplet()

    drop.post("post") { request in guard let name = request.data["name"]?.string else { throw Abort.badRequest } return try JSON(node: [ "message": "Hello \(name)!" ]) } drop.run()
  11. Parse JSON // Main.swift import Vapor let drop = Droplet()

    drop.post("post") { request in guard let name = request.data["name"]?.string else { throw Abort.badRequest } return try JSON(node: [ "message": "Hello \(name)!" ]) } drop.run()
  12. // Package.swift import PackageDescription let package = Package( name: "TestVapor",

    dependencies: [ .Package(url: "https://github.com/vapor/ vapor.git", majorVersion: 1, minor: 0), .Package(url: "https://github.com/OpenKitten/ MongoKitten.git", majorVersion: 1, minor: 0) ] ) Database with MongoKitten %
  13. // Package.swift import PackageDescription let package = Package( name: "TestVapor",

    dependencies: [ .Package(url: "https://github.com/vapor/ vapor.git", majorVersion: 1, minor: 0), .Package(url: "https://github.com/OpenKitten/ MongoKitten.git", majorVersion: 1, minor: 0) ] ) $ swift build && package generate-xcodeproj Cloning https://github.com/OpenKitten/MongoKitten.git generated: ./TestVapor.xcodeproj Database with MongoKitten %
  14. MongoKitten % import MongoKitten func testMongo() { // Connect let

    server: Server server = try! Server(mongoURL: "mongodb://usr:pss@host:port", automatically: true ) let database = server["database"] let userCollection = database["users"] // Insert let userDocument: Document = ["username": "John"] try! userCollection.insert(userDocument) // Find let resultUsers = try! userCollection.find() for userDocument in resultUsers { print(userDocument["username"].stringValue) } }
  15. // Package.swift import PackageDescription let package = Package( name: "TestVapor",

    dependencies: [ .Package(url: "https://github.com/vapor/ vapor.git", majorVersion: 1, minor: 0), .Package(url: "https://github.com/vapor/ mongo-provider.git", majorVersion: 1, minor: 0) ] ) Make it easy with Fluent
  16. // Package.swift import PackageDescription let package = Package( name: "TestVapor",

    dependencies: [ .Package(url: "https://github.com/vapor/ vapor.git", majorVersion: 1, minor: 0), .Package(url: "https://github.com/vapor/ mongo-provider.git", majorVersion: 1, minor: 0) ] ) $ swift build && package generate-xcodeproj Cloning https://github.com/vapor/mongo-provider.git generated: ./TestVapor.xcodeproj Make it easy with Fluent
  17. import Vapor import VaporMongo import FluentMongo var drop = Droplet()

    drop.preparations = [User.self] try drop.addProvider(VaporMongo.Provider.self) // Config/secrets/mongo.json { "user": "", "password": "", "database": "local", "port": "27017", "host": "127.0.0.1" } // main.swift
  18. final class User: Model { static var entity = "users"

    // Collection name var id: Node? var name: String init(name: String) { self.name = name } init(node: Node, in context: Context) throws { id = try node.extract("id") name = try node.extract("name") } func makeNode(context: Context) throws -> Node { return try Node(node: [ "id": id, "name": name ]) } // For Database that needs preparation static func prepare(_ database: Database) throws {} static func revert(_ database: Database) throws {} } Persistable object
  19. import Vapor import VaporMongo import FluentMongo var drop = Droplet()

    drop.preparations = [User.self] try drop.addProvider(VaporMongo.Provider.self) drop.post("user") { request in guard let name = request.data["name"]?.string else { throw Abort.badRequest } var user = User(name: name) try user.save() return try user.makeJSON() } drop.run()
  20. import Vapor import VaporMongo import FluentMongo var drop = Droplet()

    drop.preparations = [User.self] try drop.addProvider(VaporMongo.Provider.self) drop.post("user") { request in guard let name = request.data["name"]?.string else { throw Abort.badRequest } var user = User(name: name) try user.save() return try user.makeJSON() } drop.run()
  21. import Vapor import VaporMongo import FluentMongo var drop = Droplet()

    drop.preparations = [User.self] try drop.addProvider(VaporMongo.Provider.self) drop.get("user", String.self) { request, id in if let user = try User.find(id) { return try user.makeJSON() } else { throw Abort.notFound } } drop.run()
  22. import Vapor import VaporMongo import FluentMongo var drop = Droplet()

    drop.preparations = [User.self] try drop.addProvider(VaporMongo.Provider.self) drop.get("user", String.self) { request, id in if let user = try User.find(id) { return try user.makeJSON() } else { throw Abort.notFound } } drop.run()
  23. import Vapor import VaporMongo import FluentMongo var drop = Droplet()

    drop.preparations = [User.self] try drop.addProvider(VaporMongo.Provider.self) drop.get("users") { request in let users = try User.all() return try JSON(users.makeNode()) } drop.run()
  24. Thank you @Gonzo Oin [email protected] ' vapor.university Tutorials ' github.com/vapor/vapor

    sources & examples ' vapor.team Slack ' github.com/GabrielAraujo/VaporMongo Good example ' bit.ly/testVaporGonzoOin This keynote’s test project