ex03

command
v0.0.0-...-c93e153 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jun 24, 2018 License: MIT Imports: 6 Imported by: 0

README

Q2.3: gzipされたJSON出力をしながら、標準出力にログを出力

JSONをgzip化してクライアントに返すウェブサービスを開発しているとします。本章で説明したようにhttp.ResponseWriterを指定してJSONエンコーダーで変換をかけるとJSONが生成できますが、そのままではどのようなレスポンスをクライアントに返したのかログを残すことができません。os.Stdoutに出力するとログが残るものとして、JSONの文字列変換、gzip圧縮を行いながら圧縮前の出力を標準出力にもだすように、io.MultiWriterを使ってみましょう。gzip出力の最後にFlush()が必要な点に注意してください。

package main

import (
    "compress/gzip"
    "encoding/json"
    "io"
    "net/http"
    "os"
)

func handler(w http.ResponseWriter, r *http.Request) {
   w.Header().Set("Content-Encoding", "gzip")
   w.Header().Set("Content-Type", "application/json")
   // json化する元のデータ
   source := map[string]string{
       "Hello": "World",
   }
   // ここにコードを書く
}

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

Result

$ go run multiwriter.go
{
    "Hello": "World",
    "example": "encoding"
}
$ curl --compressed -D - -X GET "localhost:8080/"
HTTP/1.1 200 OK
Content-Encoding: gzip
Content-Type: application/json
Date: Sun, 10 Dec 2017 01:25:12 GMT
Content-Length: 62

{
    "Hello": "World",
    "example": "encoding"
}

Documentation

The Go Gopher

There is no documentation for this package.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL