カテゴリ: Go言語 更新日: 2026/03/12

Go言語のhttp.ResponseWriterとhttp.Requestの仕組みを理解しよう

Go言語のhttp.ResponseWriterとhttp.Requestの仕組みを理解しよう
Go言語のhttp.ResponseWriterとhttp.Requestの仕組みを理解しよう

先生と生徒の会話形式で理解しよう

生徒

「Go言語でWebアプリを作るときに、http.ResponseWriterとhttp.Requestってよく出てきますけど、これは何ですか?」

先生

「http.ResponseWriterはブラウザに返すデータを書き込むための仕組み、http.Requestはブラウザから送られてきたリクエストの情報を取得するための仕組みです。」

生徒

「もう少し具体的にいうとどういうことですか?」

先生

「たとえば、ブラウザが『このページを表示してください』と要求すると、それがRequestに入ります。そして、ResponseWriterにHTMLや文字列を書き込むことでブラウザに返します。」

生徒

「なるほど、Requestが受け取る側で、ResponseWriterが返す側なんですね!」

先生

「そうです。では、実際にコードで確認してみましょう。」

1. ResponseWriterでブラウザに出力する

1. 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)
}
(ブラウザで http://localhost:8080 にアクセスすると、サーバーが書き込んだ文字がそのまま表示されます)

ポイント:ResponseWriterは「返すもの」を書く相手、Fprintlnは改行つきで1行ずつ返す道具です。まずは短い文を返すところから始め、慣れてきたら見出しや段落などのHTML文字列を少しずつ増やしていくと理解が進みます。

2. Requestでリクエスト情報を取得する

2. Requestでリクエスト情報を取得する
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パラメータを使って動的に処理する

3. Queryパラメータを使って動的に処理する
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のヘッダー情報を取得する

4. Requestのヘッダー情報を取得する
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を使うポイント

5. ResponseWriterとRequestを使うポイント
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言語を基礎からスッキリ学びたい人や、 文法だけでなく「実用的な使い方」まで押さえたい人には、 定番の入門書がこちらです。

基礎からわかるGo言語をAmazonで見る

※ Amazon広告リンク

この記事を読んだ人からの質問

この記事を読んだ人からの質問
この記事を読んだ人からの質問

プログラミング初心者からのよくある疑問/質問を解決します

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つの理解

1. 環境構築の完全な理解

「なぜ動くのか」という設定の仕組みを理解し、今後の独学で詰まらない土台を作ります。

2. Go言語の基本構造(変数・型)

データの種類やメモリの概念など、他言語にも通じるプログラミングの本質を学びます。

3. 読みやすいコードの書き方

ただ動くだけでなく、誰が見ても分かりやすい「綺麗なコード」を書くための考え方を伝授します。

※本講座は、将来的にバックエンドエンジニアクラウドインフラに興味がある未経験者のためのエントリー講座です。マンツーマン形式により、あなたの理解度に合わせて進行します。

セミナー画像

初めてのGo言語を一緒に学びましょう!

カテゴリの一覧へ
新着記事
New1
Go言語
Go言語のwhile的なforループの使い方!条件式ループの基本を解説
New2
Go言語
Go言語プログラムの実行方法まとめ!VSCode・ターミナルでの実行手順を解説
New3
Swift
Swift意味とは?プログラミング言語・金融・鳥の違いを徹底解説
New4
Swift
Swift 戻り値の扱い方と複数戻り値の返し方|初心者でも分かる関数の基本
人気記事
No.1
Java&Spring記事人気No1
Go言語
Go言語でリダイレクト処理を行う方法(http.Redirect)を初心者向けに解説
No.2
Java&Spring記事人気No2
Swift
Swift開発環境の構築方法を徹底解説!Xcode・Windows・Linux対応
No.3
Java&Spring記事人気No3
Kotlin
Android Studioのインストール手順と初期設定を初心者向けに完全解説!
No.4
Java&Spring記事人気No4
Kotlin
Gradleファイル(build.gradle.kts)の書き方と役割をやさしく解説!Kotlin初心者向け完全ガイド
No.5
Java&Spring記事人気No5
Go言語
Go言語のgo.modファイル完全ガイド!初心者でもわかる仕組みと書き方
No.6
Java&Spring記事人気No6
Swift
Swift Playgroundの使い方を完全解説!初心者に最適な学習環境の始め方
No.7
Java&Spring記事人気No7
Go言語
Go言語で条件式を1行で書くコツ!三項演算子の代替と短縮記法
No.8
Java&Spring記事人気No8
Kotlin
Kotlinの演算子一覧と使い方!算術・比較・論理演算子の基本を解説