一架梯子,一头程序猿,仰望星空!
Go Fiber教程 > 内容正文

Go Fiber参数处理


本章介绍Go Fiber框架如何处理各种请求参数

简单例子

fiber框架的所有请求参数都是通过上下文对象Ctx获取

app.Get("/user/:name?", func(c *fiber.Ctx) error {
    // 通过路由函数的Ctx参数,调用合适的方法获取参数
    // 这里通过Params获取name参数
    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("*",  "默认值")  // 可以通过第二个参数设置默认值
})

获取Int类型的路由参数

// GET http://example.com/user/123
app.Get("/user/:id", func(c *fiber.Ctx) error {
  id, err := c.ParamsInt("id") // int 123 and no error

  // ...
})

获取Get请求Query参数

// 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"

  // ...
})

返回所有query参数

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

将query参数绑定到struct对象

// 定一个接收参数的struct
// 可以通过query标签设置需要绑定的参数名
type Person struct {
    Name     string     `query:"name"`
    Pass     string     `query:"pass"`
    Products []string   `query:"products"`
}

app.Get("/", func(c *fiber.Ctx) error {
        // 定义接收参数的struct变量
        p := new(Person)

        // 通过QueryParser将query参数绑定到变量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 {
  // Get first value from form field "name":
  c.FormValue("name")
  // => "john" or "" if not exist

  // ..
})

Body参数处理

主要用于POST/PUT请求,支持处理JSON、XML、form(普通表单)参数.

// 定义接收参数的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将body参数绑定到变量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"

如何向获取原始的body数据,例子如下

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

app.Post("/", func(c *fiber.Ctx) error {
  // 通过BodyRaw返回原始body数据
  return c.Send(c.BodyRaw()) // []byte("user=john")
})

获取请求头(header)

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"

  // ...
})

如果你部署在服务器上使用了代理或者负载均衡,需要通过x-forwarded-for头获取客户ip,如下设置

app := fiber.New(fiber.Config{
  ProxyHeader: fiber.HeaderXForwardedFor,
})
app.Get("/", func(c *fiber.Ctx) error {
  // Get cookie by key:
  c.Cookies("name")         // "john"
  c.Cookies("empty", "doe") // "doe"
  // ...
})