Go言語のhttp.ResponseWriterとhttp.Requestの仕組みを理解しよう
生徒
「Go言語でWebアプリを作るときに、http.ResponseWriterとhttp.Requestってよく出てきますけど、これは何ですか?」
先生
「http.ResponseWriterはブラウザに返すデータを書き込むための仕組み、http.Requestはブラウザから送られてきたリクエストの情報を取得するための仕組みです。」
生徒
「もう少し具体的にいうとどういうことですか?」
先生
「たとえば、ブラウザが『このページを表示してください』と要求すると、それがRequestに入ります。そして、ResponseWriterにHTMLや文字列を書き込むことでブラウザに返します。」
生徒
「なるほど、Requestが受け取る側で、ResponseWriterが返す側なんですね!」
先生
「そうです。では、実際にコードで確認してみましょう。」
1. ResponseWriterでブラウザに出力する
まずは「画面に文字を返す」だけを体験しましょう。http.ResponseWriterは、サーバーからブラウザへ送るメッセージの「書き込み口」です。ここに文字列や簡単なHTMLをfmt.Fprintln(改行つき)やfmt.Fprintf(書式指定)で書き込むと、そのままブラウザに表示されます。
package main
import (
"fmt"
"net/http"
)
func handler(w http.ResponseWriter, r *http.Request) {
// 文字を返す(最初の一歩)
fmt.Fprintln(w, "Go言語のHTTPサーバーからこんにちは")
// 少しだけHTMLらしく返す
fmt.Fprintln(w, "<h1>はじめてのResponseWriter</h1>")
// 好みの文面を組み立てて返す
title := "ミニWebページ"
fmt.Fprintf(w, "<p>%s を表示中です。</p>\n", title)
}
func main() {
http.HandleFunc("/", handler)
// ローカルで待ち受け(終了はCtrl+C)
http.ListenAndServe(":8080", nil)
}
ポイント:ResponseWriterは「返すもの」を書く相手、Fprintlnは改行つきで1行ずつ返す道具です。まずは短い文を返すところから始め、慣れてきたら見出しや段落などのHTML文字列を少しずつ増やしていくと理解が進みます。
2. Requestでリクエスト情報を取得する
http.Requestは「ブラウザから届いた手紙」のようなものです。封筒には宛先(どのURLに来たか)と用件(どの操作をしたいか)が書かれています。まずは難しいことは考えず、URLのパスとリクエストメソッドの2つだけ読めるようになりましょう。これが分かると、どのページに来たのか、表示なのか登録なのか、といった基本判断ができるようになります。
func handler(w http.ResponseWriter, r *http.Request) {
// アクセス先のパス(例: "/", "/about", "/users/1" など)
fmt.Fprintln(w, "リクエストのURLパス:", r.URL.Path)
// 用件を表すメソッド(例: GET=表示、POST=送信 など)
fmt.Fprintln(w, "リクエストメソッド:", r.Method)
// 参考: 通信のバージョンや相手の情報(読み物として眺める程度でOK)
fmt.Fprintln(w, "プロトコル:", r.Proto)
fmt.Fprintln(w, "アクセス元:", r.RemoteAddr)
}
/、/hello、/about/company など異なるパスへアクセスしてみて、表示される「URLパス」と「メソッド」の違いを観察しましょう。まずはこの2点を読めればOKです)
ポイント:URLパスで「どのページか」を判定し、メソッドで「何をしたいか」を判断します。最初はこの組み合わせだけで分岐(if文など)を書けるようにすると、Webサーバーの挙動がぐっと理解しやすくなります。
3. Queryパラメータを使って動的に処理する
Requestのr.URL.Query()を使うと、URLに含まれるクエリパラメータを取得できます。たとえば、?name=太郎と付けてアクセスすると、その値を取得できます。
func handler(w http.ResponseWriter, r *http.Request) {
name := r.URL.Query().Get("name")
if name == "" {
name = "名無し"
}
fmt.Fprintf(w, "こんにちは、%sさん!", name)
}
このようにすることで、URLによって表示内容を変える動的なWebページを作ることができます。
4. Requestのヘッダー情報を取得する
Requestにはブラウザの情報やCookieなども含まれています。r.Headerを使うと、ブラウザの種類や送信された情報を確認できます。
func handler(w http.ResponseWriter, r *http.Request) {
userAgent := r.Header.Get("User-Agent")
fmt.Fprintf(w, "あなたのブラウザは %s です", userAgent)
}
このようにしてユーザーの環境に合わせた処理を行うことも可能です。
5. ResponseWriterとRequestを使うポイント
- ResponseWriterに出力することで、ブラウザに文字列やHTMLを返せる
- RequestからはURL、メソッド、ヘッダー、クエリパラメータなどを取得できる
- これらを組み合わせることで、ユーザーのリクエストに応じた柔軟なWebアプリを作れる
- まずは簡単な文字列の表示から始めて、徐々にリクエスト情報を活用してみる
ResponseWriterとRequestの仕組みを理解すれば、Go言語でWebアプリを作るときの基本的な流れがわかります。初心者でも、少しずつ慣れていくことが大切です。
まとめ
Go言語でWebアプリケーションを作るときに、http.ResponseWriterとhttp.Requestはとても重要な役割を持っています。それぞれがブラウザとサーバーの橋渡しをするので、動的なページ表示や、フォーム送信、クエリパラメータを使った切り替えなど、実践的な処理に欠かせません。今回の内容では、文字列の表示、URLパスの取得、クエリパラメータ処理、ヘッダー情報の取得まで一通り触れてきました。特に、サーバー側で処理を行い、ResponseWriterで出力を返すという仕組みは、Webサービスの基本であり、小さなサンプルでも実際の動作を確認しながら理解できる部分です。 また、Requestから取り出せる情報が多いほど、利用者ごとに違う反応ができる便利なWebアプリが作れます。同じURLにアクセスしても、クエリパラメータが違えば表示が変わり、ブラウザが違えばメッセージを変えることも可能です。こうした柔軟な処理は、Go言語の標準パッケージだけで実現でき、余計な設定を増やさずにWebページを返せる点が魅力です。 さらに、ResponseWriterとRequestを正しく使い分けることで、無理のない読みやすいコードが書けます。同じハンドラ関数の中で、リクエストの情報を読み取って、レスポンスを整えて返す。この流れを理解すれば、シンプルなAPIサーバー、フォーム入力を受け取る処理、ログインページなど、幅広い場面に応用できます。書くたびに実行して、ブラウザから確認することで、自然に感覚として身につきます。
簡単なサンプルでもう一度おさらい
下のコードは今まで学んだ内容をまとめた形で、パス、メソッド、クエリパラメータ、ヘッダーを使ったサンプルです。
package main
import (
"fmt"
"net/http"
)
func handler(w http.ResponseWriter, r *http.Request) {
path := r.URL.Path
method := r.Method
name := r.URL.Query().Get("name")
if name == "" {
name = "名無し"
}
userAgent := r.Header.Get("User-Agent")
fmt.Fprintf(w, "アクセスしたパス: %s\n", path)
fmt.Fprintf(w, "メソッド: %s\n", method)
fmt.Fprintf(w, "こんにちは、%sさん\n", name)
fmt.Fprintf(w, "ブラウザ情報: %s\n", userAgent)
}
func main() {
http.HandleFunc("/", handler)
http.ListenAndServe(":8080", nil)
}
ひとつの画面にアクセスするだけで、複数の情報をまとめて扱えるため、開発を進めるほど便利さを感じられるはずです。シンプルなコードでも丁寧に理解すると、もっと複雑なページやログ管理、フォーム送信の処理などにも応用できます。まずは試しに動かしてみて、URLに「?name=花子」などを付けて反応を変えると違いがよく分かります。ブラウザごとにメッセージを出したり、パスで処理を切り替えたりする練習もおすすめです。
生徒
「最初は難しいと思っていましたけど、ResponseWriterが返す役で、Requestが受け取る役だと考えると分かりやすかったです。」
先生
「その通りですね。特に、Requestの中にあるURLやヘッダーを扱えるようになると、実用的な仕組みが作れます。どう使えそうですか?」
生徒
「例えば、ブラウザの種類でページを切り替えたり、クエリパラメータでユーザー名を出したりできると思いました。」
先生
「良い発想ですね。小さな動作から積み重ねていくと、ログイン機能やメッセージ送信も組み立てられますよ。」
生徒
「少しずつ試していけば、自分でもWebアプリが作れそうな気がしてきました!」
先生
「大丈夫、積み上げれば必ずできます。ResponseWriterとRequestは中心になる部分なので、今回学んだことを忘れずに活用してみてください。」
この記事を読んだ人からの質問
プログラミング初心者からのよくある疑問/質問を解決します
Go言語でWebアプリを作るときに、http.ResponseWriterとhttp.Requestは必ず使うのですか?
Go言語でWebサーバーを作る場合、ブラウザからのリクエストを受け取り、その結果をブラウザに返す流れが基本になるので、この二つはとても重要です。ResponseWriterはブラウザに文字やHTMLを返す役割、Requestはブラウザから送られてきたURLやクエリパラメータの情報を取得する役割があります。Webアプリ開発では基本的にセットで使用します。
【超入門】ゼロから始めるGo言語プログラミング:最速で「動くアプリ」を作るマンツーマン指導
「プログラミングの仕組み」が根本からわかる。Go言語でバックエンド開発の第一歩を。
本講座を受講することで、単なる文法の暗記ではなく、「プログラムがコンピュータの中でどう動いているか」という本質的な理解につながります。シンプルながら強力なGo言語(Golang)を通じて、現代のバックエンドエンジニアに求められる基礎体力を最短距離で身につけます。
具体的な開発内容と環境
【つくるもの】
ターミナル(黒い画面)上で動作する「対話型計算プログラム」や、データを整理して表示する「ミニ・ツール」をゼロから作成します。自分の書いたコードが形になる感動を体験してください。
【開発環境】
プロの現場でシェアNo.1のVisual Studio Code (VS Code)を使用します。インストールから日本語化、Go言語用の拡張機能設定まで、現場基準の環境を一緒に構築します。
この60分で得られる3つの理解
「なぜ動くのか」という設定の仕組みを理解し、今後の独学で詰まらない土台を作ります。
データの種類やメモリの概念など、他言語にも通じるプログラミングの本質を学びます。
ただ動くだけでなく、誰が見ても分かりやすい「綺麗なコード」を書くための考え方を伝授します。
※本講座は、将来的にバックエンドエンジニアやクラウドインフラに興味がある未経験者のためのエントリー講座です。マンツーマン形式により、あなたの理解度に合わせて進行します。
初めてのGo言語を一緒に学びましょう!