在Go中以字符串形式访问HTTP响应


122

我想解析Web请求的响应,但是在以字符串形式访问它时遇到了麻烦。

func main() {
    resp, err := http.Get("http://google.hu/")
    if err != nil {
        // handle error
    }
    defer resp.Body.Close()
    body, err := ioutil.ReadAll(resp.Body)

    ioutil.WriteFile("dump", body, 0600)

    for i:= 0; i < len(body); i++ {
        fmt.Println( body[i] ) // This logs uint8 and prints numbers
    }

    fmt.Println( reflect.TypeOf(body) )
    fmt.Println("done")
}

如何以字符串形式访问响应?ioutil.WriteFile将响应正确地写入文件。

我已经检查过包参考,但并没有真正的帮助。

Answers:


220

bs := string(body) 应该足以给你一个字符串。

从那里,您可以将其用作常规字符串。

有点像这个线程

var client http.Client
resp, err := client.Get(url)
if err != nil {
    log.Fatal(err)
}
defer resp.Body.Close()

if resp.StatusCode == http.StatusOK {
    bodyBytes, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        log.Fatal(err)
    }
    bodyString := string(bodyBytes)
    log.Info(bodyString)
}

另请参阅GoByExample

如下所述(在zzn答案中),这是一次转换(请参阅spec)。
请参阅“ 如何昂贵的是[]byte(string) ”(相反的问题,但同样的结论适用),其中ZZZZ提到:

有些转换与强制转换相同,例如uint(myIntvar),只是重新解释了适当的位。

索尼娅补充说:

用字节片制作字符串,肯定涉及在堆上分配字符串。不变性迫使这一点。
有时,您可以通过使用[] byte进行尽可能多的工作,然后在最后创建一个字符串来进行优化。该bytes.Buffer类型通常很有用。


谢谢。您有什么建议,我怎么能自己解决?string()如何做到这一点?为什么用reflect.TypeOf看不到它?
Tibor Szasz

1
@TiborSzasz这是一个简单的转换:请参阅blog.golang.org/slices#TOC_12
VonC

您的代码的一个小改进将是使用http.StatusOK而不是原始200值!
Shadoninja

我一直在这样做,发现我的请求正文始终总是以换行符结尾。这对于请求正文是正常的还是由ioutil.ReadAll()
sixty4bit

29

您用于读取http正文响应的方法将返回一个字节片:

func ReadAll(r io.Reader) ([]byte, error)

官方文件

您可以转换 []byte为字符串

body, err := ioutil.ReadAll(resp.Body)
bodyString := string(body)

1

string(byteslice)会将字节片转换为字符串,只知道它不仅是简单的类型转换,而且还包括内存复制。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.