Slide 1

Slide 1 text

Goで作る初めてのHTTPサーバー @from_unknown

Slide 2

Slide 2 text

前提 発表者のスキルはこんな感じです。 ● Goでいくつかツールを作った事はある ● Goでサーバーサイドは書いた事がない ● PHPでサーバーサイドは書いた事はある ですので、今回はこれからGoでHTTPサーバーを書いてみたい  初心者の方向けの話になります。

Slide 3

Slide 3 text

GoでHTTPサーバーを立てるには? ● Apacheやnginxが必要? ● サーバーのソースはどんな感じで書くの? ● htmlはどこに書くの? ● Cookieやセッションはどう扱うの? ● 本番環境と開発環境の切り替えはどうやるの?

Slide 4

Slide 4 text

Apacheやnginxが必要? Golangは標準ライブラリでHTTPサーバーが提供されているの で、なくても動作しますがあった方がよいです。 理由: ● アクセスログを出力してくれる ● 静的ページの出力はApacheに任せられる ● 複数サービスを1つのサーバーでホストする時にApache側で 捌ける

Slide 5

Slide 5 text

Apacheやnginxを使う場合 ● リバースプロキシでGolangに流す ○ GolangはHTTPサーバーとして実行する ■ サーバーに直アクセス可能 ○ 必要なヘッダーはApacheから追加する様に設定する ○ 間にキャッシュサーバーなどを挟むことも可能 ● FastCGIでGolangを呼び出す ○ GolangはFastCGIで実装し、実行する ■ サーバーに直アクセス不可 ○ FastCGI側がアクセスに応じて自動でGolangのプロセスを立ち 上げられる

Slide 6

Slide 6 text

サーバーのソースはどんな感じで書くの? package main import ( "fmt" "log" "net/http" ) func handler(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hi there, I love %s!", r.URL.Path[1:]) } func main() { http.HandleFunc("/", handler) log.Fatal(http.ListenAndServe(":8080", nil)) } ※公式のWikiを作るサンプルからコピー https://golang.org/doc/articles/wiki/

Slide 7

Slide 7 text

サーバーのソースはどんな感じで書くの? package main import ( "fmt" "log" "net/http" ) func handler(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hi there, I love %s!", r.URL.Path[1:]) } func main() { http.HandleFunc("/", handler) log.Fatal(http.ListenAndServe(":8080", nil)) } URLのパスが”/”の時にfunc handlerを実行する

Slide 8

Slide 8 text

サーバーのソースはどんな感じで書くの? package main import ( "fmt" "log" "net/http" ) func handler(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hi there, I love %s!", r.URL.Path[1:]) } func main() { http.HandleFunc("/", handler) log.Fatal(http.ListenAndServe(":8080", nil)) } ResponseWriterに、文言+URLのパス の値(”/”以下全て)を付けて書き込む これがサーバーからの応答のBody部と なる

Slide 9

Slide 9 text

サーバーのソースはどんな感じで書くの? package main import ( "fmt" "log" "net/http" ) func handler(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hi there, I love %s!", r.URL.Path[1:]) } func main() { http.HandleFunc("/", handler) log.Fatal(http.ListenAndServe(":8080", nil)) } ポート8080でアクセスを受 け付ける 異常時はログを出力して終 了する

Slide 10

Slide 10 text

APIを書く時はもちろんこれだけでは足りない http.HandleFunc("/api/createuser", func(w http.ResponseWriter, r *http.Request) { if r.Method == "OPTIONS" { headers := w.Header() headers.Add("Access-Control-Allow-Origin", "*") headers.Add("Vary", "Origin") … headers.Add("Access-Control-Allow-Methods", "GET, POST,OPTIONS") w.WriteHeader(http.StatusOK) } else { createUserHandler(w, r) } return })

Slide 11

Slide 11 text

APIを書く時はもちろんこれだけでは足りない http.HandleFunc("/api/createuser", func(w http.ResponseWriter, r *http.Request) { if r.Method == "OPTIONS" { headers := w.Header() headers.Add("Access-Control-Allow-Origin", "*") headers.Add("Vary", "Origin") … headers.Add("Access-Control-Allow-Methods", "GET, POST,OPTIONS") w.WriteHeader(http.StatusOK) } else { createUserHandler(w, r) } return }) CORSのpreflightで 来る”OPTIONS”も ちゃんと捌きましょう

Slide 12

Slide 12 text

htmlはどこに書くの? テンプレートファイルを作成して、変数を埋め込めます。 例:

{{.Title}}

[edit]

{{printf "%s" .Body}}
変数や簡単な処理などを 埋め込んでいます

Slide 13

Slide 13 text

テンプレートファイルの出力の仕方 例: func renderTemplate(w http.ResponseWriter, p *Page) { t, _ := template.ParseFiles("template.html") t.Execute(w, p) } テンプレートファイルをパースしてExecuteします。 テンプレ内でloopしたり関数を埋め込んだりも可能です。

Slide 14

Slide 14 text

Cookieやセッションはどう扱うの? Cookieは簡単に作れますが、セッションマネージャーは標準では 用意されていません。 以下のライブラリがセッションを提供しています。 他にもググったら色々あるようなので、もしデファクトスタンダード があれば教えてください。 http://www.gorillatoolkit.org/ https://github.com/icza/session

Slide 15

Slide 15 text

Cookieのセットの仕方 ※wはhttp.ResponseWriterです sampleCookie := &http.Cookie{ Name: “sample”, Value: “sample”, } http.SetCookie(w, sampleCookie) Cookieには上記以外にもMaxAgeなどの設定が追加可能です。

Slide 16

Slide 16 text

本番環境と開発環境の切り替えはどうやるの? ● 環境変数で切り替える ○ Init関数(main関数より先に呼ばれる関数)内で環境変数 を取得し、本番か開発かで値を切り替える ● build variantsで切り替える ○ ソースの一番上部にbuild variantsを記載しておく ○ tagを指定することで開発時のみや本番時のみだけビルド に含まれるファイルが作成出来る

Slide 17

Slide 17 text

build variantsの例 // +build debug ←debugタグの時のみ含まれる // +build !debug ←debugタグ以外の時のみ含まれる debugタグのファイルが含まれるビルド go build -tags debug [file] debugタグのファイルが含まれないビルド go build [file]

Slide 18

Slide 18 text

まとめ ● 単体でも動作しますがApacheやnginxを入れましょう ● ロジックからサーバーの設定まで、やりたいことは全てソース に書きます ● テンプレートも用意されています ● Cookieはありますがセッションは標準で提供されていないの で、ライブラリを導入しましょう ● 環境の切り替えは環境変数かbuild variantsを使って切り替え ましょう

Slide 19

Slide 19 text

ご清聴ありがとうございました!