Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【ITニュース解説】Building Web Servers from First Principles (Part 5)

2025年09月18日に「Dev.to」が公開したITニュース「Building Web Servers from First Principles (Part 5)」について初心者にもわかりやすく解説しています。

作成日: 更新日:

ITニュース概要

Webサーバー構築第5回では、URLの「?」以降の「クエリパラメータ」の扱い方を学ぶ。Go言語で`r.URL.Query().Get()`を使い、パラメータを抽出し、複数パラメータや型変換を処理する方法を解説。これにより、フィルタリングやページネーションに対応した、よりインタラクティブなAPIを構築する基礎を習得する。

ITニュース解説

Webサーバーを構築する際、ユーザーからの様々なリクエストに柔軟に対応するためには、URLを通じて送られてくる情報を正しく読み解く能力が不可欠だ。これまでのステップでは、URLのパスの一部として特定の情報を受け取る「URLパラメータ」(例えば /users/:id:id の部分)の扱い方を学んだ。しかし、実際のWebアプリケーションでは、もっと多様な条件で情報を取得したり、ユーザーの入力を受け付けたりする必要がある。そこで今回学ぶのが、「クエリパラメータ」というもう一つの重要な情報の渡し方だ。

クエリパラメータは、URLの末尾に「?」を付けた後、「キー=値」という形式で情報を記述する仕組みだ。複数の情報を渡したい場合は、「&」でつなげて「キー1=値1&キー2=値2」のように記述する。例えば、商品の検索機能を考えてみよう。「/search?q=javascript&page=2」というURLは、「q」というキーで「javascript」という検索キーワードを、そして「page」というキーで「2」ページ目の情報を要求していることをサーバーに伝えている。これは、特定のユーザーのプロフィール(/users/123)のように、パスそのものが指し示すリソースを特定するURLパラメータとは異なり、リソースに対して「どのような条件で」「どのようなオプションを適用して」取得するかという補足的な情報を伝える役割を果たす。

Go言語でこのクエリパラメータをサーバー側で受け取るのは非常に簡単だ。HTTPリクエストを表す r オブジェクトには、URLに関する情報が r.URL として格納されている。この r.URL から Query() メソッドを呼び出すと、URLに含まれるすべてのクエリパラメータを「キーと値のペア」のコレクションとして取得できる。さらに、そのコレクションに対して Get("キー名") メソッドを使うことで、特定のキーに対応する値を取り出すことが可能だ。もし、指定したキーのクエリパラメータがURLに含まれていなかった場合、Get() メソッドは空の文字列を返すため、プログラムで簡単にその有無を判断できる。例えば、「name」というクエリパラメータがある場合は「Hello John」と表示し、なければ「Hello stranger!」と表示するような分岐処理を簡単に実装できる。また、URLエンコーディング(スペースが %20 となるなど)された値も自動的にデコードされるため、開発者はその変換について意識する必要がない。

実際のAPIでは、一つのリクエストで複数のクエリパラメータを扱うことがよくある。例えば、検索機能で「q」(検索クエリ)と「page」(ページ番号)の両方を指定する場合だ。これらも r.URL.Query().Get("q")r.URL.Query().Get("page") のように、それぞれ個別に取得する。URL内でパラメータの記述順序は関係なく、どちらが先に記述されていても問題なく値を取得できる。もし一部のパラメータが省略されていても、そのキーに対応する値は空文字列として扱われる。

クエリパラメータで渡される値は、たとえそれが数字であっても、Go言語のプログラム内では基本的に「文字列」として扱われる。そのため、数値として計算に利用したい場合は、明示的に型変換を行う必要がある。Go言語では strconv.ParseInt() のような関数を使って、文字列を整数型に変換できる。この際、もしユーザーが数字ではない文字列(例: a=hello)を渡してきた場合、ParseInt() はエラーを返すとともに、デフォルトで 0 のような値を返すことがある。このような「無効な入力」に対する適切なエラーハンドリングや、変換に失敗した場合の処理は、堅牢なAPIを構築する上で非常に重要だ。初心者のうちは、入力が数値でなかった場合にどのような挙動になるか確認し、意図しない結果にならないよう注意が必要だ。

ここで改めて、URLパラメータとクエリパラメータの違いを整理しよう。URLパラメータ(パスパラメータとも呼ばれる)は、users/123123 のように、Web上の特定のリソースを識別するために使われる。これは通常、そのリソースにアクセスするために「必須」の情報となる。一方、クエリパラメータは、search?q=golang&page=2 のように、リソースの取得方法や表示条件を「オプション」で指定するために使われる。フィルタリング、ソート、ページネーション、検索キーワードなどがその典型的な例だ。これら二つのパラメータは組み合わせて使うことも可能で、例えば「/users/123/posts?limit=10&sort=date」のように、特定のユーザーの投稿を、さらに投稿数とソート順という条件で取得する、といった複雑なリクエストも処理できるようになる。

クエリパラメータの利用パターンは多岐にわたる。例えば、特定のパラメータが指定されなかった場合に、サーバー側でデフォルト値を設定する機能はよく使われる。また、in_stock=true のように真偽値(true/false)を扱うパラメータや、tags=web&tags=api のように同じキー名で複数の値を渡して、それらをリストとして一括で取得する (r.URL.Query()["tags"][]string として取得) といった高度な使い方も可能だ。これらのパターンを理解することで、より柔軟で表現豊かなAPIを設計できるようになる。

今回学んだGo言語でのクエリパラメータの処理方法は、GinやEchoのような人気のWebフレームワークでも、概念的にはまったく同じだ。フレームワークは c.Query("name")c.Param("id") のように、より直感的で便利なメソッドを提供してくれるが、内部で行われている処理の根本は r.URL.Query().Get() やパスパラメータの抽出と変わらない。したがって、Goの標準ライブラリでこれらの基礎を理解しておくことは、どんなフレームワークを使うにしても、強力な土台となる。

今回の学習を通じて、Webサーバーがユーザーからの多様な情報を含むリクエスト(URLパラメータとクエリパラメータの両方)を効果的に処理できるようになり、APIの応答性を大きく向上させることができた。文字列としてのパラメータを受け取り、必要に応じて数値などの適切な型に変換する能力も手に入れた。これからのステップでは、さらにAPIの機能を拡張していく。具体的には、サーバーが永続的にデータを保存する方法、JSON形式でデータの送受信を行う本格的なAPIの構築、POSTやPUTといったリクエストで送られてくるデータ(リクエストボディ)の処理、そしてWebサービスで一般的なCRUD(作成・読み出し・更新・削除)操作を持つAPIの実装へと進んでいく。これらの要素が組み合わさることで、完全なWebアプリケーションのバックエンドを構築する基盤が完成する。

関連コンテンツ

関連IT用語