動作環境
この記事では以下の環境で動作を確認しています。
- Xcode9.0
- macOS Sierra バージョン 10.12.6
- MacBook Pro (13-inch,2017,Four Thunderbolt 3 Ports)
- Homebrew 1.3.2
- ruby 2.1.8p440 (2015-12-16 revision 53160) [x86_64-darwin15.0]
- Vapor Toolbox: 2.0.4
- Vapor Framework: 2.2.2
ルーティング-基礎編
ルーティングはWebフレームワークで最も重要となる機能です。ルーティングをきちんと設定することで、あらゆるリクエストに対して適切なレスポンスを返すことができます。
この記事ではVaporのルーティングの設定をみていきます。
エンドポイント登録
エンドポイントの登録はDroplet
インスタンスに対して、HTTPメソッドと対応するインスタンスメソッドを実行します。その際にエンドポイントを文字列で引数に指定します。レスポンスはクロージャーの中で値を返すことで表現します。
ルーティングをするためには
RouteBuilder
プロトコルを適応する必要があります。vapor new <Name>
でVaporアプリケーションを作成している場合はVapor Toolboxがデフォルトで適応させています。vapor build
を実行後下記のファイルを参照することで確かめられます。
/.build/checkouts/vapor.git-[チェックアウトハッシュ値]/Sources/Vapor/Routing/Droplet+Routing.swift
GET /welcome
でアクセスされた場合にHello
という文字列を返すには以下のようにします。
//getメソッドを実行
drop.get("welcome"){ req
return "Hello"
}
標準的なHTTPメソッドがすでに利用できます。
get
、post
、put
、patch
、delete
とoptions
などです。
先程のエンドポイントをPOSTでも対応できるようにしてみます。
POST /welcome
でアクセスされた場合にHello
という文字列を返すようにします。
//postメソッドを実行
drop.post("welcome"){ req in
return "Hello"
}
ネスト
/
で区切られるエンドポイントを作成したい場合、エンドポイントをそのまま文字列として引数に渡せばよいです。
GET /welcome/to/vapor
にアクセスしたらHello
の文字列を返すエンドポイントを作成するには以下のようにします。
drop.get("welcome/to/vapor"){ req in
return "Hello"
}
しかし、各パスを引数として渡しても同じ結果を得られます。
drop.get("welcome", "to", "vapor"){ req in
return "Hello"
}
このやり方は、welcome/to/vapor
のように全てのパスを文字列として渡すよりも、URLパラメーターとして値を渡せるメリットがあります。
型安全なパラメーター
従来のWebフレームワークはルート設定に文字列を指定しているので型の違いからエラーが発生することがありました。
VaporではSwiftの型安全の仕組みを使い、安全にルーティングのパラメーターを扱えます。
型安全なパラメーターを作るためには、パスの一部に型を指定します。
Userを検索するためのエンドポイントを作成してみましょう。
GET /users/:id
のエンドポイントを作成します。/:id
はInt型の値とします。
drop.get("users", Int.parameter) { req in
let userId = try req.parameters.next(Int.self)
return "You requested User #\(userId)"
}
引数を型で指定しない場合は以下のように書くことで同じような結果を得ることができます。
drop.get("users", ":id") { request in
guard let userId = request.parameters["id"]?.int else {
throw Abort.badRequest
}
return "You requested User #\(userId)"
}
その他のエンドポイントの指定
メソッドを第一引数として渡す方法もあります。
drop.add(.trace, "welcome") { request in
return "Hello"
}
ルーティングを動的に設定したり、あまり使用頻度の低いHTTPメソッドを利用する際にこの構文は有効です。
フォールバック
引数に*
を追加することで、フォールバックルートを設定することができます。
drop.get("anything", "*") { request in
return "/anythingの後ろのどんなものでもマッチする"
}
上記の場合エンドポイントは下記のように/anything
以下すべてのパスにマッチします。
- /anything
- /anything/foo
- /anything/foo/bar
- /anything/foo/bar/baz
参考
Basic Routing
https://docs.vapor.codes/2.0/routing/overview/
Routing Parameters
https://docs.vapor.codes/2.0/routing/parameters/