如何使用http响应方式在go中读取?

问题描述 投票:0回答:3

自从接触 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)

我在这里缺少什么?

go
3个回答
8
投票
html: [] num: 0, err: <nil>

,其len将为“0”,并且Read将最多

html
字节读取到html中
这是来自 

https://golang.org/pkg/io/#Reader

的片段

Read 将最多 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)

这里是播放
链接

,在 go Playground 中 HTTP 请求不起作用,这是一种安全预防措施,所以你可以在你的机器上测试一下


1
投票

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)) }



0
投票
ReadAll()

您的代码应如下所示:

import "io/ioutil" ... body, err := ioutil.ReadAll(resp.Body) resp.Body.Close() fmt.Println(string(body)

© www.soinside.com 2019 - 2024. All rights reserved.