アイリスフレームワークには、ルートバインディングのための2つのモードがあります。1つは機能的なモードであり、もう1つはMVC(Model-View-Controller)モードです。機能的なモードでは、指定されたURLパスに対するハンドリング関数をバインドします。一方、MVCモードでは、コントローラをURLパスにバインドします。フレームワークは、コントローラメソッドの命名規則に基づいて対応するURLパスを自動的に生成し、対応するコントローラ関数を自動的にバインドします。
機能的なルートバインディング
アイリスフレームワークの中で最もシンプルなルーティングモデルであり、任意のURLに関数をバインドすることができます。
func main() {
// デフォルトのミドルウェアを使用してアイリスアプリケーションを作成します。
// デフォルトでは、"debug"ログレベルを使用します。
// "./locales"ディレクトリに配置されたローカライゼーションをサポートします。
// HTMLテンプレートは"./views"または"./templates"ディレクトリに配置されています。
// アクセスログは"./access.log"に保存され、クラッシュせずにリカバリとリクエストIDのミドルウェアがすでにアタッチされています。
app := iris.Default()
// HTTPリクエストメソッドとパスに基づいて、簡単にルート関数をバインドします。これは、Ginやechoなどのフレームワークのルーティングメカニズムに似ています。
app.Get("/someGet", getting)
app.Post("/somePost", posting)
app.Put("/somePut", putting)
app.Delete("/someDelete", deleting)
app.Patch("/somePatch", patching)
app.Header("/someHead", head)
app.Options("/someOptions", options)
// ポートでリッスンします
app.Listen(":8080")
}
パス内のパラメータ
func main() {
app := iris.Default()
// このハンドラは/user/johnにはマッチしますが、/user/や/userにはマッチしません
app.Get("/user/{name}", func(ctx iris.Context) {
name := ctx.Params().Get("name")
ctx.Writef("こんにちは %s", name)
})
// しかしながら、このハンドラは/user/john/や/user/john/sendにはマッチします
// /user/johnに他のルートがマッチしない場合、/user/john/にリダイレクトされます
app.Get("/user/{name}/{action:path}", func(ctx iris.Context) {
name := ctx.Params().Get("name")
action := ctx.Params().Get("action")
message := name + "は" + action
ctx.WriteString(message)
})
// 一致するリクエストごとに、Contextはルート定義を保持します
app.Post("/user/{name:string}/{action:path}", func(ctx iris.Context) {
ctx.GetCurrentRoute().Tmpl().Src == "/user/{name:string}/{action:path}" // true
})
app.Listen(":8080")
}
利用可能な組み込みパラメータの種類:
パラメータの種類 | Goの型 | 検証条件 | 取得方法 |
---|---|---|---|
:string |
string | 任意の文字 (単一のパスセグメント) | Params().Get |
:uuid |
string | uuidv4またはv1の形式 (単一のパスセグメント) | Params().Get |
:int |
int | -9223372036854775808 から 9223372036854775807 (x64) または -2147483648 から 2147483647 (x32)、ホストのアーキテクチャによる | Params().GetInt |
:int8 |
int8 | -128 から 127 | Params().GetInt8 |
:int16 |
int16 | -32768 から 32767 | Params().GetInt16 |
:int32 |
int32 | -2147483648 から 2147483647 | Params().GetInt32 |
:int64 |
int64 | -9223372036854775808 から 9223372036854775807 | Params().GetInt64 |
:uint |
uint | 0 から 18446744073709551615 (x64) または 0 から 4294967295 (x32)、ホストのアーキテクチャによる | Params().GetUint |
:uint8 |
uint8 | 0 から 255 | Params().GetUint8 |
:uint16 |
uint16 | 0 から 65535 | Params().GetUint16 |
:uint32 |
uint32 | 0 から 4294967295 | Params().GetUint32 |
:uint64 |
uint64 | 0 から 18446744073709551615 | Params().GetUint64 |
:bool |
bool | "1" または "t" または "T" または "TRUE" または "true" または "True" または "0" または "f" または "F" または "FALSE" または "false" または "False" | Params().GetBool |
:alphabetical |
string | 小文字または大文字のアルファベット | Params().Get |
:file |
string | 小文字または大文字のアルファベット、数字、アンダースコア(_)、ハイフン(-)、ピリオド(.)のみを含む、スペースや他のファイル名に適さない特殊文字を含まない | Params().Get |
:path |
string | 任意の文字、スラッシュ(/)で区切ることができます (パスセグメント)、ただしルートパスの最後でなければなりません | Params().Get |
:mail |
string | ドメインの検証されていないメールアドレス | Params().Get |
:email |
string | ドメインが検証されたメールアドレス | Params().Get |
:date |
string | 形式はyyyy/mm/dd、例: /blog/{param:date} は /blog/2022/04/21にマッチします | Params().GetTime および Params().SimpleDate |
:weekday |
uint (0-6) または string | 時間.Weekdayの長い名前 ("sunday" から "monday" または "Sunday" から "Monday") の文字列形式、例: /schedule/{param:weekday} は /schedule/mondayにマッチします | Params().GetWeekday |
グループルーティング
時には、APIバージョン管理が必要な場合や、大規模なモジュールのルーティングに統一された接頭辞を設定する必要があります。このような場合には、グループルーティングの機能が必要となります。
func main() {
app := iris.Default()
// シンプルなグループ: v1
v1 := app.Party("/v1")
{
v1.Post("/login", loginEndpoint)
v1.Post("/submit", submitEndpoint)
v1.Post("/read", readEndpoint)
}
// シンプルなグループ: v2
v2 := app.Party("/v2")
{
v2.Post("/login", loginEndpoint)
v2.Post("/submit", submitEndpoint)
v2.Post("/read", readEndpoint)
}
app.Listen(":8080")
}
MVC ルーティング
GoのIrisフレームワークはMVCアーキテクチャをサポートし、特定のルールに従ってルートを特定のコントローラー関数にマッピングします。
package main
import (
"strings"
"github.com/kataras/iris/v12"
"github.com/kataras/iris/v12/middleware/logger"
"github.com/kataras/iris/v12/middleware/recover"
"github.com/kataras/iris/v12/mvc"
)
// Irisアプリケーションを作成する
func newApp() *iris.Application {
app := iris.New()
// 2つのミドルウェアを設定
// recoverはパニックエラーを傍受して異常なプログラム終了を回避するために使用されます
// loggerはリクエストをログに記録するために使用されます
app.Use(recover.New())
app.Use(logger.New())
// コントローラーを"/"ルートルートに登録
mvc.New(app).Handle(new(ExampleController))
// ルートグループを利用して特定のパスに登録することもできます
// 例: /booksの下にコントローラーを登録
// mvc.New(app.Party("/books")).Handle(new(ExampleController))
}
func main() {
// アプリケーションを作成
app := newApp()
// http://localhost:8080
// http://localhost:8080/ping
// http://localhost:8080/hello
// http://localhost:8080/custom_path
app.Listen(":8080")
}
// "/"、"/ping"、および"/hello"のリクエストを処理するためのExampleControllerを定義します。
type ExampleController struct{}
// GETリクエストを処理
// リクエストURL: http://localhost:8080
func (c *ExampleController) Get() mvc.Result {
return mvc.Response{
ContentType: "text/html",
Text: "<h1>ようこそ</h1>",
}
}
// GetPing です
// メソッド: GET
// リクエストURL: http://localhost:8080/ping
func (c *ExampleController) GetPing() string {
return "pong"
}
// GetHello です
// メソッド: GET
// リクエストURL: http://localhost:8080/hello
func (c *ExampleController) GetHello() interface{} {
return map[string]string{"message": "こんにちは、アイリス!"}
}
// GetHelloWorld です
// メソッド: GET
// リクエストURL: http://localhost:8080/hello/world
func (c *ExampleController) GetHelloWorld() interface{} {
return map[string]string{"message": "こんにちは、アイリス!DefaultPath"}
}
MVCルーティングとコントローラー関数の命名規則の関係。
ルートアドレス: ルートグループ + HTTPメソッド名 + 関数名(小文字)
例:
func (c *ExampleController) GetPing() string {
return "pong"
ルートグループが設定されていないため、この関数はhttp://localhost:8080/pingのGETリクエストを処理できます。