gpt4 book ai didi

go - 如何使用http Response method Read in go?

转载 作者:IT王子 更新时间:2023-10-29 02:27:35 24 4
gpt4 key购买 nike

我已经有一段时间没接触 go 了,我似乎忘记了如何阅读文档。

如果我做这样的获取请求...

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

然后我看到响应有一个 Bodyio.ReadCloser 类型 ( https://golang.org/pkg/io/#ReadCloser )。我看到 ReadCloser 是 ReaderCloser 的接口(interface)。

当我查看 Reader 接口(interface)时,我发现它有一个 Read 方法,可以将字节读入 p ( https://golang.org/pkg/io/#Reader )。

回顾一下,http Response 有一个主体,它是一个 io.ReadCloser 接口(interface),它本身包含一个 Reader 接口(interface),它有一个 Read 方法。

当我尝试此操作时,我希望将响应字节Read 转换为 HTML,但我什么也没看到...

var html []byte
num, err := resp.Body.Read(html)
fmt.Println("\n\thtml: ", html)
fmt.Printf("\n\tnum: %v, err: %v\n", num, err)

输出:

html:  []
num: 0, err: <nil>

我在这里错过了什么?

最佳答案

简短回答:您正在传递一个 slice html,其中它的 len 将为“0”并且 Read 读取最多 len(html) 个字节到 html

这是来自 https://golang.org/pkg/io/#Reader 的片段

Read reads up to len(p) bytes into p. It returns the number of bytesread (0 <= n <= len(p)) and any error encountered. Even if Readreturns n < len(p), it may use all of p as scratch space during thecall. If some data is available but not len(p) bytes, Readconventionally returns what is available instead of waiting for more.

现在您可以使用 ioutil 并将代码更新为

body, err := ioutil.ReadAll(resp.Body)

代码

package main

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

func main() {
resp, err := http.Get("http://httpbin.org/ip")
if err != nil {
fmt.Println("Error making request", err.Error())
return
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println("Error reading response", err.Error())
return
}
fmt.Println("Response\n", string(body))
}

这是播放link ,在 go playground 中 HTTP 请求将不起作用这是一种安全预防措施,因此您可以在您的机器上进行测试

关于go - 如何使用http Response method Read in go?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41668644/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com