Iris có quy trình định tuyến dễ dàng và mạnh mẽ nhất bạn từng gặp.

Iris có quy trình thông dịch riêng cho cú pháp đường dẫn, phân tích cú pháp và đánh giá tuyến (giống như ngôn ngữ lập trình!).

Nó nhanh thế nào? Nó tính toán nhu cầu của nó và nếu không cần bất kỳ biểu thức chính quy nào thì nó chỉ cần đăng ký tuyến với cú pháp đường dẫn cấp thấp, nếu không nó sẽ biên dịch trước biểu thức chính quy và thêm phần mềm trung gian cần thiết. Điều đó có nghĩa là bạn có chi phí hiệu năng bằng 0 so với các bộ định tuyến hoặc web framework khác.

 


Thông số

Tên của tham số đường dẫn chỉ chứa các chữ cái. Số hoặc ký hiệu như _' là không được phép.

Đừng nhầm lẫn ctx.Params() với ctx.Values().

Giá trị của tham số đường dẫn có thể được lấy từ ctx.Params().

Lưu trữ cục bộ của Context có thể được sử dụng để liên lạc giữa các trình xử lý và phần mềm trung gian có thể được lưu trữ vào ctx.Values().

Các loại tham số có sẵn có thể được tìm thấy trong bảng sau.

Param Type

Go TypeValidationRetrieve Helper
:stringstringanything (single path segment)Params().Get
:intint-9223372036854775808 to 9223372036854775807 (x64) or -2147483648 to 2147483647 (x32), depends on the host archParams().GetInt
:int8int8-128 to 127Params().GetInt8
:int16int16-32768 to 32767Params().GetInt16
:int32int32-2147483648 to 2147483647Params().GetInt32
:int64int64-9223372036854775808 to 9223372036854775807Params().GetInt64
:uintuint0 to 18446744073709551615 (x64) or 0 to 4294967295 (x32), depends on the host archParams().GetUint
:uint8

uint8

0 to 255Params().GetUint8
:uint16uint160 to 65535Params().GetUint16
:uint32uint320 to 4294967295Params().GetUint32
:uint64

uint64

0 to 18446744073709551615Params().GetUint64
:boolbool"1" or "t" or "T" or "TRUE" or "true" or "True" or "0" or "f" or "F" or "FALSE" or "false" or "False"Params().GetBool
:alphabeticalstringlowercase or uppercase lettersParams().Get
:filestringlowercase or uppercase letters, numbers, underscore (_), dash (-), point (.) and no spaces or other special characters that are not valid for filenamesParams().Get
:pathstringanything, can be separated by slashes (path segments) but should be the last part of the route pathParams().Get

Sử dụng

app.Get("/users/{id:uint64}", func(ctx iris.Context){
    id := ctx.Params().GetUint64Default("id", 0)
    // [...]
})
Built-in FuncParam Types
regexp(expr string):string
prefix(prefix string):string
suffix(suffix string):string
contains(s string):string
min(minValue int or int8 or int16 or int32 or int64 or uint8 or uint16 or uint32 or uint64 or float32 or float64):string(char length), :int, :int8, :int16, :int32, :int64, :uint, :uint8, :uint16, :uint32, :uint64
max(maxValue int or int8 or int16 or int32 or int64 or uint8 or uint16 or uint32 or uint64 or float32 or float64):string(char length), :int, :int8, :int16, :int32, :int64, :uint, :uint8, :uint16, :uint32, :uint64
range(minValue, maxValue int or int8 or int16 or int32 or int64 or uint8 or uint16 or uint32 or uint64 or float32 or float64)Usage::int, :int8, :int16, :int32, :int64, :uint, :uint8, :uint16, :uint32, :uint64

Sử dụng

app.Get("/profile/{name:alphabetical max(255)}", func(ctx iris.Context){
    name := ctx.Params().Get("name")
    // len(name) <=255 otherwise this route will fire 404 Not Found
    // and this handler will not be executed at all.
})

Do It Yourself:

RegisterFunc có thể chấp nhận bất kỳ hàm nào trả về func(paramValue string) bool. Hoặc chỉ là một func(string) bool. Nếu xác thực thất bại thì nó sẽ kích hoạt 404 hoặc bất kỳ mã trạng thái nào mà từ khóa khác có.

latLonExpr := "^-?[0-9]{1,3}(?:\\.[0-9]{1,10})?$"
latLonRegex, _ := regexp.Compile(latLonExpr)

// Register your custom argument-less macro function to the :string param type.
// MatchString is a type of func(string) bool, so we use it as it is.
app.Macros().Get("string").RegisterFunc("coordinate", latLonRegex.MatchString)

app.Get("/coordinates/{lat:string coordinate()}/{lon:string coordinate()}",
func(ctx iris.Context) {
    ctx.Writef("Lat: %s | Lon: %s", ctx.Params().Get("lat"), ctx.Params().Get("lon"))
})

Đăng ký chức năng marco tùy chỉnh của bạn chấp nhận hai đối số là số nguyên.

app.Macros().Get("string").RegisterFunc("range",
func(minLength, maxLength int) func(string) bool {
    return func(paramValue string) bool {
        return len(paramValue) >= minLength && len(paramValue) <= maxLength
    }
})

app.Get("/limitchar/{name:string range(1,200) else 400}", func(ctx iris.Context) {
    name := ctx.Params().Get("name")
    ctx.Writef(`Hello %s | the name should be between 1 and 200 characters length
    otherwise this handler will not be executed`, name)
})

Đăng ký chức năng marco tùy chỉnh của bạn chấp nhận một slice của chuỗi [...,...].

app.Macros().Get("string").RegisterFunc("has",
func(validNames []string) func(string) bool {
    return func(paramValue string) bool {
        for _, validName := range validNames {
            if validName == paramValue {
                return true
            }
        }

        return false
    }
})

app.Get("/static_validation/{name:string has([kataras,maropoulos])}",
func(ctx iris.Context) {
    name := ctx.Params().Get("name")
    ctx.Writef(`Hello %s | the name should be "kataras" or "maropoulos"
    otherwise this handler will not be executed`, name)
})

Ví dụ:

func main() {
    app := iris.Default()

    // This handler will match /user/john but will not match neither /user/ or /user.
    app.Get("/user/{name}", func(ctx iris.Context) {
        name := ctx.Params().Get("name")
        ctx.Writef("Hello %s", name)
    })

    // This handler will match /users/42
    // but will not match /users/-1 because uint should be bigger than zero
    // neither /users or /users/.
    app.Get("/users/{id:uint64}", func(ctx iris.Context) {
        id := ctx.Params().GetUint64Default("id", 0)
        ctx.Writef("User with ID: %d", id)
    })

    // However, this one will match /user/john/send and also /user/john/everything/else/here
    // but will not match /user/john neither /user/john/.
    app.Post("/user/{name:string}/{action:path}", func(ctx iris.Context) {
        name := ctx.Params().Get("name")
        action := ctx.Params().Get("action")
        message := name + " is " + action
        ctx.WriteString(message)
    })

    app.Run(iris.Addr(":8080"))
}

Khi kiểu tham số bị thiếu thì nó mặc định là một chuỗi, do đó {name:string} và {name} đề cập đến cùng một điều chính xác.

Phần tiếp theo chúng ta sẽ tìm hiểu về Tra cứu ngược