2017-10-17 97 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”)'。 –

相关问题