Go勉強会 Webアプリケーション編 #1で使おうと思っているGo Web Examplesの和訳です。ほぼGoogle翻訳ですが、リンク等も整理された状態であると便利だと思い作りました。次回(HTTP Server)
はじめに
Goはバッテリーを内蔵したプログラミング言語で、Webサーバーがすでに組み込まれています。標準ライブラリのnet/httpパッケージには、HTTPプロトコルに関するすべての機能が含まれています。これには、(他の多くのものの中でも)HTTPクライアントとHTTPサーバーが含まれます。この例では、ブラウザーで表示できるWebサーバーを作成する方法を簡単に把握します。
リクエストハンドラの登録
まず、ブラウザ、HTTPクライアント、またはAPIリクエストからすべてのHTTP接続を受け取るHandlerを作成します。 GoのHTTPハンドラは、次のシグネチャを持つ関数です。
func (w http.ResponseWriter, r *http.Request)
この関数は2つのパラメータを受け取ります。
- text/htmlレスポンスを書き込むhttp.ResponseWriter
- このHTTPリクエストに関するすべての情報(URLやヘッダーフィールドなど)を含むhttp.Request
リクエストハンドラをデフォルトのHTTPサーバーに登録するのは、次のように簡単です。
http.HandleFunc("/", func (w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello, you've requested: %s\n", r.URL.Path)
})
HTTP接続をリッスンする
リッスンとは(引用元: e-words: リッスン)
TCP/IPの通信ができるOS上で動作しているプログラムが、特定のポート番号への接続を待ち受けること
リクエストハンドラだけでは、外部からのHTTP接続を受け入れることはできません。 HTTPサーバーは、リクエストハンドラに接続を渡すためにポートで待機する必要があります。 ほとんどの場合、ポート80番はHTTPトラフィックのデフォルトポートなので、このサーバーはHTTPトラフィックもリッスンします。 次のコードは、GoのデフォルトのHTTPサーバーを起動し、ポート80番で接続を待ち受けます。ブラウザでhttp://localhost
に移動して、サーバーがリクエストを処理するのを見てください。
http.ListenAndServe(":80", nil)
コード (コピペ用)
これは、この例で学んだことを試すために使用できる完全なコードです。
package main
import (
"fmt"
"net/http"
)
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello, you've requested: %s\n", r.URL.Path)
})
err := http.ListenAndServe(":80", nil)
fmt.Print(err)
}
動作確認
$ sudo go run server.go &
$ curl localhost:80/hello
Hello, you've requested: /hello