การจัดการพารามิเตอร์คำขอต่าง ๆ ในเฟรมเวิร์ก Go Fiber

ตัวอย่างที่ง่าย

พารามิเตอร์คำขอทั้งหมดในเฟรมเวิร์ก Fiber สามารถได้รับได้ผ่านอ็อบเจ็กต์คอนเท็กซ์ Ctx ดังนี้

app.Get("/user/:name?", func(c *fiber.Ctx) error {
    // ได้รับพารามิเตอร์ผ่านพารามิเตอร์ Ctx ของฟังก์ชันเส้นทาง และเรียกวิธีที่เหมาะสม
    // ที่นี่ พารามิเตอร์ชื่อถูกได้รับผ่าน Params
    return c.SendString(c.Params("name"))
})

การได้รับพารามิเตอร์เส้นทาง

การได้รับพารามิเตอร์จากเส้นทาง 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("*", "default value")  // สามารถตั้งค่าเริ่มต้นได้ด้วยพารามิเตอร์ตัวที่สอง
})

การได้รับพารามิเตอร์ชนิด Int ของเส้นทาง

// GET http://example.com/user/123
app.Get("/user/:id", func(c *fiber.Ctx) error {
  id, err := c.ParamsInt("id") // int 123 และไม่มีข้อผิดพลาด

  // ...
})

การได้รับพารามิเตอร์คิวรีของคำขอ GET

// GET http://example.com/?order=desc&brand=nike
app.Get("/", func(c *fiber.Ctx) error {
  c.Query("order")         // "desc"
  c.Query("brand")         // "nike"
  // สามารถใช้พารามิเตอร์ที่สองเพื่อตั้งค่าเริ่มต้น ซึ่งจะได้รับค่ากลับถ้าพารามิเตอร์ไม่มีอยู่
  c.Query("empty", "nike") // "nike"

  // ...
})

การส่งคืนพารามิเตอร์คิวรีทั้งหมด

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

การผูกพารามิเตอร์คิวรีกับออบเจ็กต์สตรักต์

// กำหนดตัวสตรักต์เพื่อรับพารามิเตอร์
// ใช้แท็กคิวรีเพื่อระบุชื่อพารามิเตอร์ที่จะถูกผูก
type Person struct {
    Name     string     `query:"name"`
    Pass     string     `query:"pass"`
    Products []string   `query:"products"`
}

app.Get("/", func(c *fiber.Ctx) error {
        // กำหนดตัวแปรสตรักต์เพื่อรับพารามิเตอร์
        p := new(Person)

        // ใช้ QueryParser เพื่อผูกพารามิเตอร์คิวรีกับตัวแปร 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]

        // ...
})
// ดำเนินคำสั่ง curl ต่อไปนี้เพื่อทดสอบ
// curl "http://localhost:3000/?name=john&pass=doe&products=shoe,hat"

การได้รับพารามิเตอร์ฟอร์มคำขอ POST

app.Post("/", func(c *fiber.Ctx) error {
  // ได้รับค่าแรกจากคอนเท็กต์ฟอร์ม "name":
  c.FormValue("name")
  // => "john" หรือ "" ถ้าไม่มีอยู่

  // ...
})

การจัดการพารามิเตอร์ของร่างกาย

มันใช้สำหรับการประมวลผลคำขอ POST/PUT และรองรับพารามิเตอร์แบบ JSON, XML, และฟอร์ม

// กำหนด struct เพื่อรับพารามิเตอร์และกำหนดชื่อฟิลด์พารามิเตอร์ที่คุณต้องการรับผ่านแท็ก json, xml, และ form
// สามารถเลือก json, xml, form ตามต้องการ; ไม่จำเป็นต้องรวมทั้งหมด
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 {
    // กำหนดตัวแปร struct เพื่อรับพารามิเตอร์
    p := new(Person)

    // ใช้ BodyParser เพื่อผูกพารามิเตอร์ร่างกายกับตัวแปร p
    if err := c.BodyParser(p); err != nil {
        return err
    }

    log.Println(p.Name) // john
    log.Println(p.Pass) // doe

    // ...
})

// ตัวอย่างของการร้องขอชนิดต่าง ๆ สำหรับการร้องขอพารามิเตอร์รูปแบบ JSON โปรดจำไว้ที่จะตั้ง 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"

วิธีดึงข้อมูลร่างกายต้นฉบับคือดังนี้:

// curl -X POST http://localhost:8080 -d user=john

app.Post("/", func(c *fiber.Ctx) error {
  // ใช้อาร์กิวเมนต์ BodyRaw เพื่อส่งข้อมูลร่างกายแบบดิบ
  return c.Send(c.BodyRaw()) // []byte("user=john")
})

การดึงหัวข้อคำขอ

app.Get("/", func(c *fiber.Ctx) error {
  c.Get("Content-Type")       // "text/plain"
  c.Get("CoNtEnT-TypE")       // "text/plain"
  c.Get("something", "john")  // "john"
  // ...
})

การดึง IP ของไคลเอนต์

app.Get("/", func(c *fiber.Ctx) error {
  c.IP() // "127.0.0.1"

  // ...
})

หากคุณติดตั้งบนเซิร์ฟเวอร์ที่ใช้พร็อกซีหรือโหลดบาลานเซอร์ คุณต้องดึง IP ของไคลเอนต์ผ่านหัวข้อ x-forwarded-for โดยการตั้งค่าตามนี้:

app := fiber.New(fiber.Config{
  ProxyHeader: fiber.HeaderXForwardedFor,
})

การอ่านคุกกี้

app.Get("/", func(c *fiber.Ctx) error {
  // รับคุกกี้ตามคีย์:
  c.Cookies("name")         // "john"
  c.Cookies("empty", "doe") // "doe"
  // ...
})