query.Values
query.Values ヘルパーの API 参照。
概要
query.Values は、HTTP クエリーパラメータ全体の読み取り専用ビューを提供します。 Controllerシグネチャでパラメータとして宣言すると、QueryValuesResolverは自動的に値を注入します。
import "github.com/NARUBROWN/spine/pkg/query"構造体の定義
type Values struct {
values map[string][]string
}コンストラクタ
NewValues
func NewValues(values map[string][]string) Values新しいValuesインスタンスを作成します。通常は直接呼び出さず、QueryValuesResolverが内部的に使用します。 パラメータ
values- クエリパラメータマップ 戻り値Values- Values インスタンス
メソッド
Get
func (q Values) Get(key string) string指定したキーの最初の値を返します。 パラメータ
key- クエリパラメータキー 戻り値string- 値。キーがない場合は空の文字列 例
// GET /users?name=john
q.Get("name") // "john"
q.Get("missing") // ""String
func (q Values) String(key string) string指定したキーの最初の値を文字列として返します。 Get()と同じ実装です。 パラメータ
key- クエリパラメータキー 戻り値string- 値。キーがない場合は空の文字列 例
// GET /users?status=active&name=john
q.String("status") // "active"
q.String("name") // "john"
q.String("missing") // ""Int
func (q Values) Int(key string, def int64) int64指定したキーの値を整数として解析します。内部的にGet()を呼び出して値を取得し、strconv.ParseIntに変換します。 パラメータ
key- クエリパラメータキーdef- 解析失敗またはキーがない場合に返されるデフォルト値 戻り値int64- 解析された整数またはデフォルト値 例
// GET /users?page=3&size=20
q.Int("page", 1) // 3
q.Int("size", 10) // 20
q.Int("offset", 0) // 0 (キーなし)
// GET /users?page=abc
q.Int("page", 1) // 1 (解析失敗)GetBoolByKey
func (q Values) GetBoolByKey(key string, def bool) bool指定したキーの値をブーリアンとして解析します。内部的にGet()を呼び出してから小文字に変換して判別します。 trueとして認識される値(大文字と小文字を無視)- "true", "1", "yes", "y", "on"
falseとして認識される値(大文字と小文字を無視)- "false", "0", "no", "n", "off"
上記に該当しない値はデフォルト値を返します。 パラメータ
key- クエリパラメータキーdef- 解析失敗またはキーがない場合に返されるデフォルト値 戻り値bool- 解析されたブールまたはデフォルト値 例
// GET /users?active=true&verified=1&premium=yes
q.GetBoolByKey("active", false) // true
q.GetBoolByKey("verified", false) // true
q.GetBoolByKey("premium", false) // true
q.GetBoolByKey("deleted", false) // false (キーなし)
// GET /users?active=maybe
q.GetBoolByKey("active", false) // false(認識できない値)Has
func (q Values) Has(key string) bool指定したキーが存在することを確認してください。 パラメータ
key- クエリパラメータキー 戻り値bool- キーが存在するかどうか 例
// GET /users?status=active&empty=
q.Has("status") // true
q.Has("empty") // true (値が空でもキーは存在)
q.Has("missing") // falseQueryValuesResolver
query.ValuesタイプをControllerパラメータとして宣言すると、QueryValuesResolverは自動的に値を生成します。
// internal/resolver/query_values_resolver.go
type QueryValuesResolver struct{}
func (r *QueryValuesResolver) Supports(pm ParameterMeta) bool {
return pm.Type == reflect.TypeFor[query.Values]()
}
func (r *QueryValuesResolver) Resolve(ctx core.ExecutionContext, parameterMeta ParameterMeta) (any, error) {
httpCtx, ok := ctx.(core.HttpRequestContext)
if !ok {
return nil, fmt.Errorf("HTTP 要求コンテキストではありません")
}
return query.NewValues(httpCtx.Queries()), nil
}Resolver は、core.ExecutionContext を core.HttpRequestContext にタイプし、それを Queries() に照会マップ全体をインポートします。 HTTP要求ではなくコンテキスト(Consumer、WebSocket)はエラーを返します。
Controllerで使用
func (c *UserController) Search(q query.Values) []User {
status := q.String("status")
page := q.Int("page", 1)
size := q.Int("size", 20)
active := q.GetBoolByKey("active", true)
return c.repo.Search(status, page, size, active)
}func (c *ProductController) Filter(q query.Values) []Product {
filters := make(map[string]string)
if q.Has("category") {
filters["category"] = q.String("category")
}
if q.Has("min_price") {
filters["min_price"] = q.String("min_price")
}
return c.repo.FindByFilters(filters)
}注
- query.Pagination - ページネーションヘルパー
- ArgumentResolver - パラメータの解釈
