Edited at

Goのnet/httpパッケージ周りについて最低限覚えておきたいポイント


動機

Goのnet/httpパッケージについて、なんとなく雰囲気を理解していた程度だったので、まずは最低限を覚えておきたいポイントをまとめる趣旨で、あれこれ調べたことをまとめてみた。


net/httpパッケージ

Goが標準で用意している、HTTPクライアント/サーバー機能を提供するパッケージです。

一方、巷ではbeegoginといったサードパーティ製の人気フレームワークが乱立していて、デファクトスタンダートは決まっていない模様。

何れにせよ、フレームワークを使うと何が嬉しいのか知りたいので、この次のステップとして使ってみたいところです。


HTTPサーバーの起動

周知の通り、Goではnet/httpパッケージを使えば簡単なHTTPサーバーを起動させることが出来ます。

環境構築を除けば、下記の通りわずか数行程度で済むので、手間の観点だけで見ればApachやNginxよりもリーズナブルな気がします。

なので、簡単なAPIサーバーを作る時に便利かもしれないです。(個人的見解)


main.go

package main

import (
"fmt"
"net/http"
)

func main() {
http.HandleFunc("/", handler)
http.ListenAndServe(":8080", nil)
}

func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "Hello World!")
}


コードを書いてgoコマンドで実行してあげればサーバーが起動します。

go run main go

起動したら、ブラウザからhttp://localhost:8080にアクセスして、Hello World!と表示されていればOKです。


動作確認

サーバー起動後、今度はcurlコマンドでアクセスしてみると、こんな感じのレスポンスが帰って来ます。

このように、確りとサーバーとして動作していることを確認することもできます。

$ curl -vvv localhost:8080

* Rebuilt URL to: localhost:8080/
* Trying ::1...
* TCP_NODELAY set
* Connected to localhost (::1) port 8080 (#0)
> GET / HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.54.0
> Accept: */*
>
< HTTP/1.1 200 OK
< Date: Wed, 01 May 2019 00:40:58 GMT
< Content-Length: 14
< Content-Type: text/plain; charset=utf-8
<
Hello, world.
* Connection #0 to host localhost left intact


net/httpのキホン

Goでサーバーを起動する際、肝になるポイントは次の2つになります。


  • Handler

  • Listen


Handler

Handlerとは、何らかのアクションをトリガーに実行される関数のことです。

ここでは、HTTPリクエストに対するレスポンスを実行するためのHandlerを意味します。


Handler作成

まず、HTTPリクエストを受け取った時にレスポンスを実行するHandlerを作ります。

func handler(w http.ResponseWriter, r *http.Request) {

fmt.Fprint(w, "Hello World!")
}

func handler(handlerは関数名)は、第一引数にhttp.ResponseWriter型第二引数にhttp.Request型を取ります。

ResponseWriter型はレスポンスを指定することが可能で、上記ではHello World!を出力する(wに入る文字列がブラウザで表示される)処理をレスポンスに指定しています。

このパターンはお作法みたいなものなので、覚えておきましょう。


Handler登録

作ったHandlerは、net/httpパッケージが用意しているhttp.HandleFunc関数で登録します。

http.HandleFunc("/", handler)

第一引数にパス(URLパターン)を、第二引数にHandlerを定義することで、HTTPリクエストに対してレスポンスできるようになります。

上記の場合、パスを/で来たHTTPリクエストを返すhandler関数(=Handler)をハンドラとして定義しています。


Listen

Listenとは、サーバーのポートが開いている状態、つまりHTTPリクエストを受け付ける状態にあることを意味します。


サーバー起動

Handlerの登録をしたら、net/httpパッケージが用意しているhttp.ListenAndServe関数で、サーバーがHTTPリクエストを受け付けるようにします。

http.ListenAndServe(":8080", nil)

第一引数に、ポート番号を表す文字列を渡し、第二引数にHandlerを渡すのが一般的のようです。

Handlerは、自分でHandlerとその処理を実装する場合を除き、通常はnilを使います。この場合、DefaultServeMuxと呼ばれるデフォルトのHandlerが使用されます。

ServeMuxに関しては、こちらの記事の説明が分かりやすかったので抜粋。


ServeMuxは、HTTPリクエストに対しての処理をPathごとに登録することができる構造体です。ServeMuxを使わなくても、HTTPリクエストを処理することはできますが、Pathごとの振り分けは余程のことがない限り必ず使うため、省略できるようになっています。



まとめ


  • GoでHTTPサーバーを起動するときのポイントは、HandlerとListenの2つ。

  • サーバー起動の流れは、Handler作成 -> Handler登録 -> サーバー起動(Listen)の3ステップ。

今回は、net/httpパッケージを用いた簡単なHTTPサーバーの起動のみでしたが、自作のHandlerを実装したり、APIを返すモックサーバを作ってみたりと、色々調べながら手を動かしてステップアップして行きたい。


参考

基本は全て公式ドキュメントに載っているので、ミニマム雰囲気だけでも掴んでおくのがベターだと思った。

https://golang.org/doc/articles/wiki/

あとは、Go言語に詳しいメルカリ上田氏の資料が参考になると思います。

https://www.slideshare.net/takuyaueda967/goweb-69949279