はじめに
この記事はQiitaに投稿した記事のコピーです。
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
という形
$ 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()
CSSやJavaScript、画像をコンテンツとして配置する場合
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