Bạn có thể không bao giờ cần sử dụng nhưng trong trường hợp.

Đôi khi bạn cần ghi đè hoặc quyết định liệu bộ định tuyến sẽ được thực thi theo yêu cầu đến hay không. Nếu bạn đã có bất kỳ kinh nghiệm nào với net/http và các web framework khác thì hàm này sẽ quen thuộc với bạn (nó có dạng một phần mềm trung gian net/http, nhưng thay vì chấp nhận trình xử lý tiếp theo, nó chấp nhận bộ định tuyến như một hàm để được thực hiện hay không)

// WrapperFunc is used as an expected input parameter signature
// for the WrapRouter. It's a "low-level" signature which is compatible
// with the net/http.
// It's being used to run or no run the router based on a custom logic.
type WrapperFunc func(w http.ResponseWriter, r *http.Request, router http.HandlerFunc)

// WrapRouter adds a wrapper on the top of the main router.
// Usually it's useful for third-party middleware
// when need to wrap the entire application with a middleware like CORS.
//
// Developers can add more than one wrappers,
// those wrappers' execution comes from last to first.
// That means that the second wrapper will wrap the first, and so on.
//
// Before build.
func WrapRouter(wrapperFunc WrapperFunc)

Bộ định tuyến tìm kiếm các tuyến dựa trên Subdomain, phương thức HTTPđường dẫn động của nó. Một Router Wrapper có thể ghi đè hành vi và thực thi mã tùy chỉnh.

Trong ví dụ này bạn sẽ chỉ thấy một trường hợp sử dụng .WrapRouter. Bạn có thể sử dụng .WrapRouter để thêm logic tùy chỉnh khi hoặc không nên thực hiện bộ định tuyến để thực thi trình xử lý của các tuyến đã đăng ký. Đây chỉ là dẫn chứng về khái niệm, bạn có thể bỏ qua hướng dẫn này.

Ví dụ:

package main

import (
    "net/http"
    "strings"

    "github.com/kataras/iris/v12"
)

func newApp() *iris.Application {
    app := iris.New()

    app.OnErrorCode(iris.StatusNotFound, func(ctx iris.Context) {
        ctx.HTML("<b>Resource Not found</b>")
    })

    app.Get("/profile/{username}", func(ctx iris.Context) {
        ctx.Writef("Hello %s", ctx.Params().Get("username"))
    })

    app.HandleDir("/", "./public")

    myOtherHandler := func(ctx iris.Context) {
        ctx.Writef("inside a handler which is fired manually by our custom router wrapper")
    }

    // wrap the router with a native net/http handler.
    // if url does not contain any "." (i.e: .css, .js...)
    // (depends on the app , you may need to add more file-server exceptions),
    // then the handler will execute the router that is responsible for the
    // registered routes (look "/" and "/profile/{username}")
    // if not then it will serve the files based on the root "/" path.
    app.WrapRouter(func(w http.ResponseWriter, r *http.Request, router http.HandlerFunc) {
        path := r.URL.Path

        if strings.HasPrefix(path, "/other") {
                // acquire and release a context in order to use it to execute
                // our custom handler
                // remember: we use net/http.Handler because here
                // we are in the "low-level", before the router itself.
                ctx := app.ContextPool.Acquire(w, r)
                myOtherHandler(ctx)
                app.ContextPool.Release(ctx)
                return
            }

            // else continue serving routes as usual.
            router.ServeHTTP(w, r) 
    })

    return app
}

func main() {
    app := newApp()

    // http://localhost:8080
    // http://localhost:8080/index.html
    // http://localhost:8080/app.js
    // http://localhost:8080/css/main.css
    // http://localhost:8080/profile/anyusername
    // http://localhost:8080/other/random
    app.Run(iris.Addr(":8080"))

    // Note: In this example we just saw one use case,
    // you may want to .WrapRouter or .Downgrade in order to
    // bypass the Iris' default router, i.e:
    // you can use that method to setup custom proxies too.
}

Không có nhiều điều để nói ở đây, nó chỉ là một hàm bao bọc chấp nhận trình soạn thảo và yêu cầu và trình xử lý tiếp theo là chính bộ định tuyến của Iris, nó được thực thi hay không, được gọi hay không, nó là một phần mềm trung gian cho toàn bộ bộ định tuyến.

Phần tiếp theo chúng ta sẽ tìm hiểu về Override Context.