2017-10-17 14 views
0

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) 

私はDumpResponseTransferWriter用のコードを読んでいるが、1f430はどこから来た私は理解することはできません。

私がcurlで同じリクエストを行うと、私は1f430を返信しません。

生のHTTP応答を書き込むための最良の方法ですか?もしそうなら、どうすればこれらのバイト数を避けることができますか?あなたがボディのインターフェイスをチェックするとhttp.Getコールがボディを含む応答タイプ、へのポインタを返す

+1

この "Transfer-Encoding:chunked"が理由です。チャンクされた応答は実際にはこれらの "1f43"の長さを持っています(実際には必要です)。したがって、チャンクされたレスポンスを作成しないでください。 Content-Length(https://golang.org/pkg/net/http/#Request.Writeを参照)を設定します。 – Volker

+0

Aha、ok。 net/http/internal/chunked(here)(https://golang.org/src/net/http/internal/chunked)の 'Write()'関数でこの情報がどこにあるのかを知りました。行く)。 –

+0

私は応答を生成していません。私はリクエストを送信して、私が戻ってきたあいまいな応答を印刷しようとしています。 –

答えて

0

あなたはそのためのインターフェースを使用することができ、あなたは、体がio.ReadCloserを実装していることがわかりますこれは、ReaderインターフェースとCloserインターフェースの両方を実装しています。

これらのインターフェイスを理解することによって、あなたは、例えば使用することができます。第二引数としてio.Copy

func Copy(dst Writer, src Reader) (written int64, err error) {...} 

を、あなたはリーダーを実装してレスポンスボディを渡すことができます。

最初の引数として、Writerは独自のカスタムタイプを実装し、Writerインターフェイスを実装するための関数を作成することもできますし、すでに実装している組み込みのos.Stdoutを使用することもできます。

+0

ありがとうございます。私はちょうど私が実際に応答のヘッダも必要としているとは決して気づいていませんでした(これは 'dumpResponse()'を使用していた理由です)。 –

+1

ヘッダーを書き込むための組み込みメソッドが表示されないため、自分で書き出すことができませんでした。 'fmt.Print(resp.Proto +" "+ resp.Status +" \ r \ n ")'である。 –

関連する問題