『入る学科間違えた高専生』の日記

プログラミングのコードを書いたりする予定です。あとは日記等。あといつまで高専生やねん

SwiftのWebフレームワークVaporを触ってみた

はじめに

この記事はQiitaに投稿した記事のコピーです。

qiita.com

SwiftがオープンソースになってからWebフレームワークができてきて、
会社の先輩からやってほしいと仰せつかったので触ってみたまとめです。

サンプル

Swiftバージョン

https://github.com/nnsnodnb/swift-vapor-samplegithub.com

Python (Bottle) バージョン←比較対象

https://github.com/nnsnodnb/python-bottle-samplegithub.com

サンプルを会社のLT大会のために作ったので適当にみてくださるとわかるかと思います。

環境構築

想定環境

Mac上のSwift環境を汚したくないのでSwiftenvを導入していきます。

# Homebrewが入っていない場合はここから
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

# Homebrewが入っている場合は以下から
$ brew install kylef/formulae/swiftenv
$ echo 'export SWIFTENV_ROOT="$HOME/.swiftenv"' >> ~/.bash_profile
$ echo 'export PATH="$SWIFTENV_ROOT/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(swiftenv init -)"' >> ~/.bash_profile
$ exec $SHELL
$ swiftenv --version

エラーが起きなければSwiftenvの導入は完了です。

$ swiftenv install https://swift.org/builds/development/xcode/swift-DEVELOPMENT-SNAPSHOT-2016-06-06-a/swift-DEVELOPMENT-SNAPSHOT-2016-06-06-a-osx.pkg
$ swiftenv versions
$ swiftenv global DEVELOPMENT-SNAPSHOT-2016-06-06-a

Vaporプロジェクト作成

プロジェクトフォルダ作成

$ mkdir vapor_sample
$ cd vapor_sample

プロジェクト初期化

$ swift build --init

パッケージ追加

Swift Package Managerを使用します。

import PackageDescription

let package = Package(
    name: "vapor_sample",
    dependencies: [
        // Vaporパッケージ
        .Package(url: "https://github.com/qutheory/vapor.git", majorVersion: 0, minor: 11),
        // Vapor テンプレートパッケージ
        .Package(url: "https://github.com/qutheory/vapor-mustache.git", majorVersion: 0, minor: 7)
    ]
)

HTMLファイルや動的にコンテンツを変更したいものを設置した場合はResources/Viewsフォルダを作成し設置する。 また、動的にコンテンツを変更したい場合はMustacheというものを使用します。 詳しくは公式ドキュメントを参照。hoge.mustacheという形

mustache.github.io

$ swift build

追加したパッケージが無事インストールされるはずです。

テンプレートを返すサンプル

import Vapor
import VaporMustache

let mustache = VaporMustache.Provider()
let app = Application(providers: [mustache])

app.get("/") { request in
    return try app.view("index.mustache")
}

app.start()
<!DOCTYPE html>
<html lang="ja">
    <head>
        <meta charset="utf-8">
        <title>トップページ</title>
    </head>
    <body>
        <h1>Hello Vapor</h1>
    </body>
</html>

テンプレートの一部を動的に変更して表示するサンプル

import Vapor
import VaporMustache

let mustache = VaporMustache.Provider()
let app = Application(providers: [mustache])

app.get("/") { request in
    return try app.view("index.mustache", context: [
        "message": "I love Swift:D"
    ])
}

app.start()
<!DOCTYPE html>
<html lang="ja">
    <head>
        <meta charset="utf-8">
        <title>トップページ</title>
    </head>
    <body>
        <h1>{{ message }}</h1>
    </body>
</html>

main.swift側のkeyとindex.mustache側の{{ key }}が対応するようにする。

JSONを返すサンプル

import Vapor

let app = Application()

app.get("/json") { request in
    return JSON([
        "name": "nnsnodnb",
        "job": [
            "category": "programmer",
            "language": "swift"
        ],
        "age": 20,
        "girl_friend": false
    ])
}

app.start()

POSTからデータを取得する

サンプルがあれなのでとりあえずJSONデータを返すもの

import Vapor

let app = Application()

app.post("/json") { request in
    return JSON([
        // Optional型になっているので注意
        "age": request.data["age"].int!,
        "name": requeste.data["name"].string!
    ])
}

app.start()

CSSJavaScript、画像をコンテンツとして配置する場合

Publicディレクトリを作成し、以下に適当にcssやらjsやらimgやらを追加することでルーティングすることなく簡単にロードさせることが可能。 割りと嬉しいです

ビルド & 実行

hoge.swiftを編集したあとは毎回コンパイルが必要です!

$ swift build
Compile Swift Module 'vapor_sample' (1 sources)
Linking .build/debug/vapor_sample
$ .build/debug/vapor_sample
Server starting at 0.0.0.0:8080

127.0.0.1:8080にアクセスできたら完了!

参考

http://qiita.com/n0bisuke/items/ed10deba4b9db2c1652b

関連