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 hidden or 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++ | |
| } |
Author
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 がインクリメントされるので安心して。