DRYな備忘録

Don't Repeat Yourself.

【Go言語】http.NewRequestでBodyできなくてはまった

問題

  • net/httpパッケージでRequestインスタンスを得るためにNewRequestを使う
  • 第三引数を指定するもBodyができない
  • なーぜー

問題のコード

package main

import (
    "bytes"
    "encoding/json"
    "fmt"
    "net/http"
)

func main() {
    data := map[string]interface{}{
        "foo": map[string]interface{}{
            "bar": "これはbarです",
            "buz": 12345678,
        },
        "hoge": []string{
            "白露", "時雨", "村雨", "夕立",
        },
    }
    b, _ := json.Marshal(data)

    req1, _ := http.NewRequest("POST", "/", bytes.NewReader(b))
    fmt.Printf("REQUEST with NewReader >\n%+v\n", req1)

    req2, _ := http.NewRequest("POST", "/", bytes.NewBuffer(b))
    fmt.Printf("REQUEST with NewBuffer >\n%+v\n", req2)
}

結果

NewRequestの第三引数にはio.Readerインターフェースなものを渡せばいいわけだけど、bytes.NewReaderとbytes.NewBufferで違う。Readの結果が違うんだと思うけどあとでしらべる。

上記コードの実行結果

REQUEST with NewReader >
&{Method:POST URL:/ Proto:HTTP/1.1 ProtoMajor:1 ProtoMinor:1 Header:map[] Body:{Reader:0xc208024b10} ContentLength:96 TransferEncoding:[] Close:false Host: Form:map[] PostForm:map[] MultipartForm:<nil> Trailer:map[] RemoteAddr: RequestURI: TLS:<nil>}
REQUEST with NewBuffer >
&{Method:POST URL:/ Proto:HTTP/1.1 ProtoMajor:1 ProtoMinor:1 Header:map[] Body:{Reader:{"foo":{"bar":"これはbarです","buz":12345678},"hoge":["白露","時雨","村雨","夕立"]}} ContentLength:96 TransferEncoding:[] Close:false Host: Form:map[] PostForm:map[] MultipartForm:<nil> Trailer:map[] RemoteAddr: RequestURI: TLS:<nil>}

今度bytesパッケージちゃんと読んでみようと思った

DRY