LoginSignup
6
5

More than 5 years have passed since last update.

Vaporのルーティングについて(基礎編)

Last updated at Posted at 2017-10-09

動作環境

この記事では以下の環境で動作を確認しています。

  • 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メソッドがすでに利用できます。
getpostputpatchdeleteoptionsなどです。

先程のエンドポイントを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/

6
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
5