LoginSignup
2
2

More than 5 years have passed since last update.

Goでnet/httpしてみる

Last updated at Posted at 2018-12-02

目的

Goでhello worldの学習が完了したので、次にWebアプリ作ってみたいなーと思っていたところ、
net/httpなるパッケージを発見し早速動かしてみました。今回使用するコードはGithub上にございます。

net/httpとは?

Goのパッケージです。ドキュメントはこちら
その名の通り、HTTPクライアントとサーバーの機能を実装するためのパッケージです。

hello world!

まずはまずはhello worldですよね。こちらの記事を参考にさせていただきました。

server1.go
package main

import (
  "fmt"
  "net/http"
)

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

func main() {
  http.HandleFunc("/", handler) // ハンドラを登録してウェブページを表示させる
  http.ListenAndServe(":8080", nil)
}

server1.goを実行します。

go run server1.go

localhost:8080にアクセスして、、、やりました、hello world!!
スクリーンショット 2018-12-01 20.10.02.png

解説

一体どうなっているのか、ドキュメントを参考にコードをみていきます。

http.HandleFunc("/", handler)

あたえられたURLパターン(第1引数)に対して、ハンドラ(第2引数)をDefaultServeMuxに登録します。(DefaultServeMuxは後ほど出てきます)
ハンドラとは、何らかのアクションをトリガーに実行される関数です。
つまり、第1引数で定義したパターンでリクエストが来たら、第2引数で定義したハンドラを呼び出すよ。ということです。

第1引数 "/"

トリガーとなるURLパターンを登録します。試しに/helloに変更してみます。
/だと見つかりませんね。
スクリーンショット 2018-12-01 20.35.29.png
/helloだと見つかりました。
スクリーンショット 2018-12-01 20.35.37.png

第2引数 handler

実行されるハンドラです。試しに2パターンセットしてみます。

server2.go
package main

import (
  "fmt"
  "net/http"
)

func handler1(w http.ResponseWriter, r *http.Request) {
  fmt.Fprintf(w, "I am handler1")
}

func handler2(w http.ResponseWriter, r *http.Request) {
  fmt.Fprintf(w, "I am handler2")
}

func main() {
  http.HandleFunc("/hander1", handler1)
  http.HandleFunc("/hander2", handler2)
  http.ListenAndServe(":8080", nil)
}

/hander1の場合は(l抜けちゃいました)、handler1というハンドラが呼び出されるので、handler1と表示されます。
スクリーンショット 2018-12-01 20.48.55.png

/hander2の場合は(l抜けちゃいました)、hander2というハンドラが呼び出されるので、handler2と表示されます。
スクリーンショット 2018-12-01 20.49.02.png

http.ListenAndServe(":8080", nil)

Listenするアドレスと、ハンドラーを定義しています。

第1引数 ":8080"

TCPのネットワークアドレスを設定します。今回のようにhost部分の記載が省略されると、使用可能なインターフェースを利用するため、localhostが使用されています。:以降はポートですね。
今回の場合、localhostの8080でListenすることになります。

第2引数 nil

ハンドラーを設定します。
nilを設定すると、DefaultServeMuxが使用されます。(HandleFuncで設定したやつです)

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

ハンドラーを定義します。

第1引数 w ResponseWriter

HTTPレスポンスを構成する際に使用されます。

第2引数 r *http.Request

サーバーが受け取ったHTTP Requestのことです。*はポインタです。

fmt.Fprintf(w, "I am handler1")

ResponseWriterであるwに"I am handler1"を書き込んでいます。

まとめ

net/httpのhello worldでした。コードはGithub上にございます。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2