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"
  // ...
})