アイリスフレームワークには、ルートバインディングのための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リクエストを処理できます。