Xử lý Các Tham Số Yêu Cầu Khác Nhau trong Khung Tựa Go Fiber
Ví dụ đơn giản
Tất cả các tham số yêu cầu trong khung tựa Fiber đều được thu thập thông qua đối tượng ngữ cảnh Ctx
.
app.Get("/user/:name?", func(c *fiber.Ctx) error {
// Thu thập tham số thông qua tham số Ctx của hàm route và gọi phương thức phù hợp
// Ở đây, tham số name được thu thập thông qua Params
return c.SendString(c.Params("name"))
})
Thu Thập Tham Số Đường Dẫn
Thu thập tham số từ đường dẫn URL
// GET http://example.com/user/fenny
app.Get("/user/:name", func(c *fiber.Ctx) error {
c.Params("name") // "fenny"
// ...
})
// GET http://example.com/user/fenny/123
app.Get("/user/*", func(c *fiber.Ctx) error {
c.Params("*") // "fenny/123"
c.Params("*1") // "fenny/123"
c.Params("*", "giá trị mặc định") // Giá trị mặc định có thể được đặt bằng tham số thứ hai
})
Thu thập tham số loại Int của đường dẫn
// GET http://example.com/user/123
app.Get("/user/:id", func(c *fiber.Ctx) error {
id, err := c.ParamsInt("id") // int 123 và không có lỗi
// ...
})
Thu Thập Tham Số Truy vấn Yêu Cầu GET
// GET http://example.com/?order=desc&brand=nike
app.Get("/", func(c *fiber.Ctx) error {
c.Query("order") // "desc"
c.Query("brand") // "nike"
// Tham số thứ hai có thể được sử dụng để đặt giá trị mặc định, sẽ được trả về nếu tham số không tồn tại
c.Query("empty", "nike") // "nike"
// ...
})
Trả về tất cả các tham số truy vấn
// GET http://example.com/?name=alex&want_pizza=false&id=
app.Get("/", func(c *fiber.Ctx) error {
m := c.Queries()
m["name"] // "alex"
m["want_pizza"] // "false"
m["id"] // ""
// ...
})
Gắn các tham số truy vấn vào một đối tượng cấu trúc
// Định nghĩa một cấu trúc để nhận các tham số
// Sử dụng thẻ truy vấn để chỉ định tên tham số để gắn
type Person struct {
Name string `query:"name"`
Pass string `query:"pass"`
Products []string `query:"products"`
}
app.Get("/", func(c *fiber.Ctx) error {
// Định nghĩa một biến cấu trúc để nhận các tham số
p := new(Person)
// Sử dụng QueryParser để gắn các tham số truy vấn vào biến p
if err := c.QueryParser(p); err != nil {
return err
}
log.Println(p.Name) // john
log.Println(p.Pass) // doe
log.Println(p.Products) // [shoe, hat]
// ...
})
// Thực hiện lệnh curl sau để kiểm tra
// curl "http://localhost:3000/?name=john&pass=doe&products=shoe,hat"
Thu Thập Tham Số Form Yêu Cầu POST
app.Post("/", func(c *fiber.Ctx) error {
// Lấy giá trị đầu tiên từ trường biểu mẫu "name":
c.FormValue("name")
// => "john" hoặc "" nếu không tồn tại
// ...
})
Xử lý Tham số Thân cơ Bản
Đây chủ yếu được sử dụng để xử lý các yêu cầu POST/PUT và hỗ trợ các tham số JSON, XML và form.
// Định nghĩa cấu trúc để nhận tham số và xác định tên trường tham số bạn muốn nhận thông qua các thẻ json, xml, và form
// json, xml, form có thể được chọn theo nhu cầu; không cần thiết phải bao gồm tất cả chúng
type Person struct {
Name string `json:"name" xml:"name" form:"name"`
Pass string `json:"pass" xml:"pass" form:"pass"`
}
app.Post("/", func(c *fiber.Ctx) error {
// Định nghĩa biến cấu trúc để nhận tham số
p := new(Person)
// Sử dụng BodyParser để ràng buộc các tham số thân cơ vào biến p
if err := c.BodyParser(p); err != nil {
return err
}
log.Println(p.Name) // john
log.Println(p.Pass) // doe
// ...
})
// Ví dụ về các loại yêu cầu; đối với các yêu cầu tham số định dạng JSON, nhớ đặt Content-Type: application/json
// curl -X POST -H "Content-Type: application/json" --data "{\"name\":\"john\",\"pass\":\"doe\"}" localhost:3000
// curl -X POST -H "Content-Type: application/xml" --data "<login><name>john</name><pass>doe</pass></login>" localhost:3000
// curl -X POST -H "Content-Type: application/x-www-form-urlencoded" --data "name=john&pass=doe" localhost:3000
// curl -X POST -F name=john -F pass=doe http://localhost:3000
// curl -X POST "http://localhost:3000/?name=john&pass=doe"
Cách lấy dữ liệu thân gốc ban đầu như sau:
// curl -X POST http://localhost:8080 -d user=john
app.Post("/", func(c *fiber.Ctx) error {
// Sử dụng BodyRaw để trả về dữ liệu thân gốc
return c.Send(c.BodyRaw()) // []byte("user=john")
})
Lấy Tiêu Đề Yêu Cầu
app.Get("/", func(c *fiber.Ctx) error {
c.Get("Content-Type") // "text/plain"
c.Get("CoNtEnT-TypE") // "text/plain"
c.Get("something", "john") // "john"
// ...
})
Lấy Địa Chỉ IP của Khách Hàng
app.Get("/", func(c *fiber.Ctx) error {
c.IP() // "127.0.0.1"
// ...
})
Nếu bạn triển khai trên máy chủ sử dụng proxy hoặc cân bằng tải, bạn cần lấy địa chỉ IP của khách hàng thông qua tiêu đề x-forwarded-for bằng cách thiết lập như sau:
app := fiber.New(fiber.Config{
ProxyHeader: fiber.HeaderXForwardedFor,
})
Đọc Cookies
app.Get("/", func(c *fiber.Ctx) error {
// Lấy cookie bằng khóa:
c.Cookies("name") // "john"
c.Cookies("empty", "doe") // "doe"
// ...
})