Last active
April 23, 2022 11:10
-
-
Save nukopy/9bc0bf58d39670dd52a9034a3b3f0db4 to your computer and use it in GitHub Desktop.
Go ならわかるシステムプログラミング Q2.3 標準出力にログを出力しつつ gzip 圧縮した JSON をレスポンスで返す
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package main | |
func main() { | |
q2_3() | |
} | |
func q2_3() { | |
http.HandleFunc("/", q2_3_handler) | |
http.ListenAndServe(":8080", nil) | |
} | |
var cnt int | |
func q2_3_handler(w http.ResponseWriter, r *http.Request) { | |
// HTTP レスポンスヘッダの設定 | |
w.Header().Set("Content-Encoding", "gzip") | |
w.Header().Set("Content-Type", "application/json") | |
// 標準出力の Writer に gzip 圧縮前、HTTP レスポンスの Writer に gzip 圧縮後を Write する | |
stdoutWriter := os.Stdout | |
gzipWriter := gzip.NewWriter(w) | |
multiWriter := io.MultiWriter(stdoutWriter, gzipWriter) | |
// レスポンスとして返す JSON の元データ | |
resJson := map[string]string{ | |
"Language": "Go", | |
"Hello": "World", | |
"My Name is": "Bob", | |
"cnt": strconv.Itoa(cnt), | |
"time": time.Now().Format("2006-01-02 15:04:05"), | |
} | |
jsonEncoder := json.NewEncoder(multiWriter) | |
jsonEncoder.Encode(resJson) // ここで Writer が Write する | |
gzipWriter.Flush() | |
cnt++ | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
ブラウザからリクエストを送ると
favicon.png
の分も HTTP リクエストが送信されて、計 2 回リクエストが送信される。そのため、1 回のブラウザからのリクエストではcnt
が 2 増えることに注意。コマンドラインから
curl
でリクエストを送るとちゃんと cnt がインクリメントされるので安心して。