go - 如何将 HTTP 响应写入标准输出?

标签 go

我正在尝试将从 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 的 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 响应的最佳方式吗?如果是这样,我该如何修复它以避免这些字节数?

最佳答案

你可以为此使用接口(interface),

http.Get 调用返回一个指向 Response 类型的指针,其中包含一个 Body,如果检查 Body 接口(interface),您可以看到 Body 实现了 io.ReadCloser,它同时实现了 Reader 和 Closer 接口(interface);

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

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

作为第二个参数,您可以传递实现 Reader 的 Response Body。

作为第一个参数,Writer,您既可以实现自己的自定义类型,也可以创建一个函数来实现 Writer 接口(interface),或者,您也可以使用已经实现它的内置 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)
}

关于go - 如何将 HTTP 响应写入标准输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46787923/

相关文章:

go - 如何在 golang 中处理 goroutines 并获得响应

go - 补丁命令的 exec.command

sockets - 转到套接字 : too many open files

go - 永久 channel 终止程序并与 RabbitMQ 消费者一起进入 channel

go - 将 gomake/gotest 用于具有外部依赖项的包

go - 在 .go 文件中运行函数和在 Go 模板中调用它有什么区别?

go - "vendoring"在 Go 中是什么意思?

go - Goroutine 中的变量没有按预期更改

dictionary - 从 Go 中的映射条目创建平面数组

go - 未定义的信息命令 : "goroutines"