Skip to content

ルーティング

パスパラメーター、クエリパラメーターについて

http://example.com/path/param1/param2?query1=param3&query2=param4

この URL の、param1param2のように、パスに埋め込まれている情報をパスパラメーターと呼びます。

また、パスパラメーターの後にkey=value&key=value&...の形で埋め込まれる情報をクエリパラメーターと呼びます。この URL のparam3param4の部分です。

パスパラメーターを取得してみよう

"hello/{ユーザー名}"というパスのリクエストが来たときに、以下を返すサーバーを書いてみましょう。

Hello, {ユーザー名}.

Echo ではパスに/:hogeのようなコロンから始まる文字列を含めると、ハンドラに渡されるContextParam関数を使うことで取得できます。
考えうる名前全てに対して 1 つずつハンドラを設定するのは不可能なので、パスパラメーターを取得して、それをもとにレスポンスを生成します。

go
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 にアクセスして実際に機能していることを確かめましょう。

解答
go
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パラメータ)一覧)。

参考

Echoでのクエリパラメータの取り方