ルーティング
パスパラメーター、クエリパラメーターについて
http://example.com/path/param1/param2?query1=param3&query2=param4
この URL の、param1
やparam2
のように、パスに埋め込まれている情報をパスパラメーターと呼びます。
また、パスパラメーターの後にkey=value&key=value&...
の形で埋め込まれる情報をクエリパラメーターと呼びます。この URL のparam3
とparam4
の部分です。
パスパラメーターを取得してみよう
"hello/{ユーザー名}"
というパスのリクエストが来たときに、以下を返すサーバーを書いてみましょう。
Hello, {ユーザー名}.
Echo ではパスに/:hoge
のようなコロンから始まる文字列を含めると、ハンドラに渡されるContext
のParam
関数を使うことで取得できます。
考えうる名前全てに対して 1 つずつハンドラを設定するのは不可能なので、パスパラメーターを取得して、それをもとにレスポンスを生成します。
package main
import (
"net/http"
"github.com/labstack/echo/v4"
)
func main() {
e := echo.New()
// GETリクエストの"/hello/:username"というパターンに対応するルートを設定し、
// URLのパラメータ(:username)を使用してhelloHandler関数を呼び出す
e.GET("/hello/:username", helloHandler)
e.Logger.Fatal(e.Start(":8080"))
}
func helloHandler(c echo.Context) error {
// ":username"というパスパラメーターを取得し、userID変数に格納する
userID := c.Param("username")
return c.String(http.StatusOK, "Hello, "+userID+".\n")
}
サーバーを立て直した後、localhost:8080/hello/pikachu にアクセスして実際に機能していることを確かめましょう。 また、URL の pikachu
の部分を自分の名前や任意の文字列にしても動く事を確認しましょう。
/hello/:username
とすることでc.Param("username")
によってpikachu
をとれることが分かりました。
参考
Echoガイド
Echoガイド routing
Echo godoc
Context godoc
クエリパラメータを取得してみよう
/hello/pikachu?page=2&lang=ja
パスパラメーターではc.Param("param")
を使いましたが、クエリパラメーターはc.QueryParam("param")
で取得できます。
クエリパラメータは順不同で?lang=ja&page=2
でも同じ意味になります。
基本問題
試しに、"hello/{ユーザー名}?lang={言語名}&page={ページ数}"
というパスのリクエストが来たときに、以下を返すサーバーを書いてみましょう。
Hello, {ユーザー名}.
language: {言語名}
page: {ページ数}
書いたらサーバーを立て直した後、localhost:8080/hello/pikachu?page=5&lang=ja にアクセスして実際に機能していることを確かめましょう。
解答
package main
import (
"net/http"
"github.com/labstack/echo/v4"
)
func main() {
e := echo.New()
e.GET("/hello/:username", helloHandler)
e.Logger.Fatal(e.Start(":8080"))
}
func helloHandler(c echo.Context) error {
userID := c.Param("username")
// クエリパラメータ "lang" の値を取得し、language 変数に格納する
// 例: /hello/pikachu?lang=ja であれば、language は "ja" になる
language := c.QueryParam("lang")
// 同様にクエリパラメータ "page" の値を取得し、pageNum 変数に格納する
pageNum := c.QueryParam("page")
return c.String(http.StatusOK, "Hello, "+userID+".\nlanguage: "+language+"\npage: "+pageNum)
}
このクエリパラメータは検索のリクエストを受け取るときに使うことが多いです。
例として、Google 検索だとこんな風になってます(Google検索のパラメータ(URLパラメータ)一覧)。