GETリクエストから受け取った生のHTTPレスポンスをstdoutに書き込もうとしています。私はhttputil.DumpResponse
が私が望むことをするだろうと思ったが、それは "より大きな"応答に不思議なバイトカウントを含むようだ。例えばHTTP応答をstdoutに書き込む方法は?
:
HTTP/1.1 200 OK
Transfer-Encoding: chunked
Content-Type: text/plain; charset=utf-8
Date: Mon, 16 Oct 2017 15:07:53 GMT
1f43
THE ACTUAL BODY CONTENT WHICH IS 8003 BYTES
0
1f43
はレスポンスボディの長さであるように思われます。 Goのhttp.response
は予告編について語っているので、予告編のサイズは0
である可能性があります。
私のコードは次のとおりです。
var resp *http.Response
var err error
if *isPost {
resp, err = http.Post(url, "application/x-www-form-urlencoded", strings.NewReader(*data))
} else {
resp, err = http.Get(url)
}
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
dump, err := httputil.DumpResponse(resp, true)
if err != nil {
log.Fatal(err)
}
fmt.Printf("%s", dump)
私はDumpResponse
とTransferWriter
用のコードを読んでいるが、1f43
と0
はどこから来た私は理解することはできません。
私がcurlで同じリクエストを行うと、私は1f43
と0
を返信しません。
生のHTTP応答を書き込むための最良の方法ですか?もしそうなら、どうすればこれらのバイト数を避けることができますか?あなたがボディのインターフェイスをチェックするとhttp.Getコールがボディを含む応答タイプ、へのポインタを返す
この "Transfer-Encoding:chunked"が理由です。チャンクされた応答は実際にはこれらの "1f43"の長さを持っています(実際には必要です)。したがって、チャンクされたレスポンスを作成しないでください。 Content-Length(https://golang.org/pkg/net/http/#Request.Writeを参照)を設定します。 – Volker
Aha、ok。 net/http/internal/chunked(here)(https://golang.org/src/net/http/internal/chunked)の 'Write()'関数でこの情報がどこにあるのかを知りました。行く)。 –
私は応答を生成していません。私はリクエストを送信して、私が戻ってきたあいまいな応答を印刷しようとしています。 –