自从我处理go以来已经有一段时间了,我似乎忘记了如何阅读文档。
如果我这样做一个获取请求......
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
方法。
当我尝试这个时,我希望将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>
我在这里缺少什么?
答案 0 :(得分:5)
简短的回答:你正在传递一个片段html
,其len将是&#39; 0&#39;和读取最多len(html)字节到html
以下是https://golang.org/pkg/io/#Reader
的摘录读取读取最多len(p)个字节到p。它返回字节数 读取(0&lt; = n&lt; = len(p))并遇到任何错误。即使阅读 返回n&lt; len(p),它可以使用所有p作为临时空间 呼叫。如果某些数据可用但不是len(p)字节,则读取 通常会返回可用的内容,而不是等待更多内容。
现在你可以做的是ise ioutil
并将代码更新为
body, err := ioutil.ReadAll(resp.Body)
或从响应对象获取ContentLength
并使用ContentLength初始化html
切片。这是一个示例代码
package main
import (
"fmt"
"net/http"
)
func main() {
var p []byte
resp, err := http.Get("http://httpbin.org/ip")
if err != nil {
fmt.Println("Error making request", err.Error())
return
}
if resp.ContentLength < 0 {
fmt.Println("No Data returned")
return
}
p = make([]byte, resp.ContentLength)
resp.Body.Read(p)
fmt.Println("Response\n", string(p))
}
这是播放link,在游乐场中,http请求无法正常工作,这是一项安全预防措施,因此您可以在自己的计算机上对此进行测试
答案 1 :(得分:0)
尝试使用“io / ioutil”包:
<p>If you want to activation your account, click this
<a href='https://play.google.com/store/apps/details?id=com.domain.appname'>Aktivasi</a>
</p>
答案 2 :(得分:0)
你错过了一位好帮手和朋友ReadAll()
您的代码应如下所示:
import "io/ioutil"
resp, err := http.Get("https://example.com")
// check err
defer resp.Body.Close() // we have to close Body if we want to reuse the connection
html, err := ioutil.ReadAll(resp.Body)
// check err
fmt.Println(string(html))