自从我处理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
方法的接口.
当我尝试这个时,我希望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:
我在这里错过了什么?
简短的回答:你正在传递一个片段html
,其len为'0'而读取读取len(html)字节为html
以下是https://golang.org/pkg/io/#Reader的摘录
读取读取最多len(p)个字节到p.它返回读取的字节数(0 <= n <= len(p))和遇到的任何错误.即使Read返回n
现在你要做的就是ise len(html)
并将代码更新为
body, err := ioutil.ReadAll(resp.Body)
或者获取ioutil
响应对象并ContentLength
使用ContentLength 初始化切片.这是一个示例代码
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)) }
这里是播放链接,在游乐场http请求不会工作这是一个安全预防措施,所以你可以在你的机器上测试这个