問題
- 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