如何写一个HTTP响应到stdout?

时间:2017-10-17 10:24:53

标签: go

我正在尝试向stdout写入从GET请求收到的原始HTTP响应。我认为httputil.DumpResponse会做我想要的,但它似乎包含了神秘的字节计数"更大的"响应。

例如:

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 {'{1}}讨论了预告片,所以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的代码,但我无法确定TransferWriter1f43的来源。

如果我使用curl提出相同的请求,我就不会在回复中获得01f43

这是编写原始HTTP响应的最佳方法吗?如果是这样,我该如何修复它以避免这些字节数?

1 个答案:

答案 0 :(得分:0)

您可以使用接口

http.Get调用返回指向Response类型的指针,该类型包含Body,如果检查Body接口,则可以看到Body实现了io.ReadCloser,它实现了Reader和Closer接口; < / p>

通过了解这些接口,您可以使用例如:io.Copy

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

作为第二个参数,您可以传递响应主体,它实现了Reader。

作为第一个参数,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)
}