如何使用http Response方法读入去?

时间:2017-01-16 02:30:01

标签: go

自从我处理go以来已经有一段时间了,我似乎忘记了如何阅读文档。

如果我这样做一个获取请求......

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

然后我看到该回复的Body属于io.ReadCloser类型(https://golang.org/pkg/io/#ReadCloser)。我看到ReadCloser是ReaderCloser的接口。

当我查看Reader界面时,我发现它有一个Read方法,可以将字节读入phttps://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>

我在这里缺少什么?

3 个答案:

答案 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))