自从接触 go 以来已经有一段时间了,我似乎忘记了如何阅读文档。
如果我执行这样的 get 请求...
resp, err := http.Get("https://example.com")
然后我看到响应有一个
Body
,属于 io.ReadCloser
类型(https://golang.org/pkg/io/#ReadCloser)。我看到 ReadCloser 是 Reader
和 Closer
的接口。
当我查看
Reader
接口时,我发现它有一个 Read
方法,可以将字节读入 p
(https://golang.org/pkg/io/#Reader)。
回顾一下,http
Response
有一个主体,它是一个 io.ReadCloser
接口,它本身包含一个 Reader
接口,该接口具有 Read
方法。
当我尝试此操作时,我希望将响应字节转换为 HTML,但我什么也没看到......
Read
输出:
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>
,其len将为“0”,并且Read将最多
html
字节读取到html中这是来自 https://golang.org/pkg/io/#ReaderRead 将最多 len(p) 个字节读取到 p 中。它返回字节数
已读 (0 <= n <= len(p)) and any error encountered. Even if Read returns n < len(p), it may use all of p as scratch space during the call. If some data is available but not len(p) bytes, Read conventionally returns what is available instead of waiting for more.
现在您可以使用
len(html)
并将代码更新为
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))
}