Go Fiberフレームワークでのさまざまなリクエストパラメータの処理
簡単な例
Fiberフレームワークのすべてのリクエストパラメータは、コンテキストオブジェクトCtx
を介して取得されます。
app.Get("/user/:name?", func(c *fiber.Ctx) error {
// ルート関数のCtxパラメータを介してパラメータを取得し、適切なメソッドを呼び出す
// ここでは、nameパラメータを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") // 2番目のパラメータでデフォルト値を設定できます
})
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リクエストクエリパラメータの取得
// GET http://example.com/?order=desc&brand=nike
app.Get("/", func(c *fiber.Ctx) error {
c.Query("order") // "desc"
c.Query("brand") // "nike"
// パラメータが存在しない場合に返されるデフォルト値を設定するために第2パラメータを使用できます
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"] // ""
// ...
})
クエリパラメータをstructオブジェクトにバインドする
// パラメータを受け取るための構造体を定義
// queryタグを使用してバインドするパラメータ名を指定します
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、およびフォームパラメータをサポートしています。
// パラメータを受信するための構造体を定義し、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 {
// パラメータを受信するための構造体変数を定義します
p := new(Person)
// BodyParserを使用して、ボディパラメータを変数pにバインドします
if err := c.BodyParser(p); err != nil {
return err
}
log.Println(p.Name) // john
log.Println(p.Pass) // doe
// ...
})
// various types of requestsの例;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"
// ...
})
プロキシやロードバランサーを使用してサーバーに展開されている場合、以下のように設定してx-forwarded-forヘッダーを介してクライアントのIPを取得する必要があります。
app := fiber.New(fiber.Config{
ProxyHeader: fiber.HeaderXForwardedFor,
})
クッキーの読み込み
app.Get("/", func(c *fiber.Ctx) error {
// キーでクッキーを取得する:
c.Cookies("name") // "john"
c.Cookies("empty", "doe") // "doe"
// ...
})