0Pricing
Go Academy · レッスン

HTTPサーバーの作成

ListenAndServe、HandlerFunc、ServeMux

「HTTPサーバーの作成」はCoddyKit上の無料Go Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはGo Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Go Academyコースには全4レッスンが含まれています。

net/http パッケージ

Go の標準ライブラリである net/http は、外部依存なしで本番運用に対応できる HTTP/1.1 および HTTP/2 サーバーを提供します。

基本的なサーバー

http.HandleFunc でハンドラーを登録し、http.ListenAndServe でリッスンを開始します。

http.HandleFunc("/hello", func(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintln(w, "Hello, World!")
})
log.Fatal(http.ListenAndServe(":8080", nil))

http.Handler インターフェース

ServeHTTP(ResponseWriter, *Request) を実装する型はすべて http.Handler です。データベースや設定を保持する状態付きハンドラーに使用します。

type App struct{ db *sql.DB }

func (a *App) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    // use a.db
}

ServeMux

http.NewServeMux() は分離されたルーターを作成します。グローバルなデフォルト mux の使用を避けるために、http.ListenAndServe に渡します(ライブラリではより安全です)。

mux := http.NewServeMux()
mux.HandleFunc("/api/users", usersHandler)
http.ListenAndServe(":8080", mux)

ステータスコードの返却

本文を書き込む前に、w.WriteHeader(code) でステータスコードを書き込みます。w.Write だけを呼び出した場合、ステータスはデフォルトで 200 になります。

w.WriteHeader(http.StatusCreated)
w.Write([]byte("created"))

JSON レスポンスの書き込み

本文を書き込む前に Content-Type を設定し、その後 json.Encoder でエンコードします。

w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(data)

リクエストの読み取り

*Request 構造体を通じて、メソッド、URL、ヘッダー、クエリパラメーター、本文にアクセスできます。

r.Method          // "GET", "POST", ...
r.URL.Path        // "/api/users"
r.URL.Query().Get("id") // query param
r.Header.Get("Authorization")

JSON リクエスト本文の解析

json.Decoder でリクエスト本文をデコードします。メモリ枯渇を防ぐには、http.MaxBytesReader で本文のサイズを制限します。

r.Body = http.MaxBytesReader(w, r.Body, 1<<20)
var req CreateUserRequest
json.NewDecoder(r.Body).Decode(&req)

サーバー設定

カスタム http.Server でタイムアウトを設定し、低速なクライアントによる攻撃を防ぎます。

srv := &http.Server{
    Addr:         ":8080",
    Handler:      mux,
    ReadTimeout:  5 * time.Second,
    WriteTimeout: 10 * time.Second,
    IdleTimeout:  120 * time.Second,
}
srv.ListenAndServe()

HTTPS

srv.ListenAndServeTLS(certFile, keyFile) を使用して HTTPS を提供します。証明書には自己署名証明書(開発環境)や、Let's Encrypt の証明書(golang.org/x/crypto/acme/autocert を使用する本番環境)を使用できます。

ハンドラーの合成

ハンドラーをラップすると、ビジネスロジックを変更せずに、横断的関心事(ロギング、認証、リカバリ)を追加できます。変更後の次のハンドラーを返します。

確認問題

http.Server に ReadTimeout と WriteTimeout を設定する必要があるのはなぜですか。

まとめ:HTTP サーバーの作成

重要なポイント:

  • 単純なサーバーには HandleFunc と ListenAndServe を使用します
  • 本番環境ではタイムアウトを設定したカスタム http.Server を使用します
  • 分離されたルーティングには ServeMux を使用します
  • JSON レスポンスには json.NewEncoder(w) を使用します

よくある質問

「HTTPサーバーの作成」レッスンは無料ですか?

はい。「HTTPサーバーの作成」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Go Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Go Academyコースには全4レッスンが含まれています。

「HTTPサーバーの作成」で何を学びますか?

ListenAndServe、HandlerFunc、ServeMux ブラウザで直接実行するハンズオンコードでGo Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Go Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのGo Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「HTTPサーバーの作成」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このGo Academyレッスンでコードを書いて実行できますか?

はい。すべてのGo Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. HTTPサーバーの作成
  2. ルーティングとパスパラメーター
  3. ミドルウェアパターン
  4. グレースフルシャットダウン
← Go Academyに戻る