2017-10-17 93 views
0

我試圖寫入標準輸出從GET請求收到的原始HTTP響應。我認爲httputil.DumpResponse會做我想做的事情,但它似乎在「更大」的響應中包含了神祕的字節數。如何向標準輸出寫入HTTP響應?

例如:

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響應的最佳方式嗎?如果是這樣,我該如何解決它以避免這些字節數?

+1

這個「傳輸編碼:分塊」是原因。實際上,分塊響應_do_(實際上必須)具有這些「1f43」長度。所以:不要進行分塊迴應,例如通過設置Content-Length(見https://golang.org/pkg/net/http/#Request.Write)。 – Volker

+0

啊哈,好的。有了這些信息,我發現了這種情況:在'net/http/internal/chunked'的'Write()'函數中[這裏](https://golang.org/src/net/http/internal/chunked。走)。 –

+0

我沒有生成響應;我正在發送請求並嘗試打印我回來的已收回的響應。 –

回答

0

您可以使用該接口,

的http.Get調用返回一個指針響應類型,其中包含了身體,如果你檢查身體的接口,你可以看到機身實現了io.ReadCloser ,它實現了Reader和Closer接口;

通過了解這些接口,你可以使用例如:io.Copy

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

至於第二個參數,你可以通過響應主體,它實現了讀者。作爲第一個參數Writer,你既可以實現你自己的自定義類型,也可以創建一個func來實現Writer接口,或者,你也可以使用內置的os.Stdout,它已經實現了它。

package main 

import (
    "fmt" 
    "io" 
    "net/http" 
    "os" 
) 

func main() { 

    resp, err := http.Get("http://google.com") 

    if err != nil { 
     fmt.Println("Error:", err) 
     os.Exit(1) 
    } 

    io.Copy(os.Stdout, resp.Body) 
} 
+0

謝謝。我剛剛意識到我從來沒有真正說過我也想要回復的標題(這就是爲什麼我使用'dumpResponse()') - 但你的答案回答了我問的問題。 –

+1

我看不到一個內置的方法來編寫標題,所以我自己寫出來,例如, 'fmt.Print(resp.Proto +「」+ resp.Status +「\ r \ n」)'。 –

相關問題