โครงสร้างของ iris framework มี 2 โหมดสำหรับการผูก route ได้ คือ โหมด functional และ โหมด MVC โดยโหมด functional จะผูกฟังก์ชันการจัดการกับเส้นทาง URL ที่กำหนดให้กับเว็บไซต์ ในขณะที่โหมด MVC จะผูกคอนโทรลเลอร์กับเส้นทาง URL โดยที่โครงสร้างจะสร้างเส้นทาง URL ที่สอดคล้องกับกฎการตั้งชื่อของเมธอดคอนโทรลเลอร์โดยอัตโนมัติ และผูกฟังก์ชันคอนโทรลเลอร์ที่สอดคล้องกันโดยอัตโนมัติ
การผูกเส้นทางโดยใช้ Functional Route Binding
โครงสร้างการเชื่อมโยงที่ง่ายที่สุดใน iris framework ที่คุณสามารถผูกฟังก์ชันกับ URL ใด ๆ ได้
func main() {
// สร้างแอพลิเคชัน iris พร้อม middleware ที่กำหนดไว้เริ่มต้น:
// โดยค่าเริ่มต้น มันใช้ "debug" ระดับบันทึก
// มันสนับสนุนการใช้งานภาษาใน "./locales" ไดเรกทอรี
// การ์ด HTML อยู่ภายใต้ไดเรกทอรี "./views" หรือ "./templates"
// บันทึกเข้าถึงบันทึกไว้ใน "./access.log",
// และ middleware การกู้คืน (โดยไม่ต้องล้มละลาย) และ request 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)
// ฟังก์ชัน Listen บนพอร์ต
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}" // เป็นจริง
})
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 | รูปแบบสตริงเป็นชื่อยาวของ time.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
Framework 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()
// ตั้งค่ามิดเดิลแวร์สองตัว
// 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")
}
// กำหนด ExampleController เพื่อจัดการคำขอสำหรับ "/", "/ping", และ "/hello"
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"
}
เนื่องจากไม่ได้ตั้งกลุ่มเส้นทาง ฟังก์ชันนี้สามารถจัดการคำขอ GET สำหรับเส้นทาง http://localhost:8080/ping ได้