本章介绍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,
})
读取cookie
app.Get("/", func(c *fiber.Ctx) error {
// Get cookie by key:
c.Cookies("name") // "john"
c.Cookies("empty", "doe") // "doe"
// ...
})