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

Tib*_*asz 96 networking go

我想解析一个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")
}
Run Code Online (Sandbox Code Playgroud)

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

我已经检查了包参考,但它并没有真正帮助.

Von*_*onC 172

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)
}
Run Code Online (Sandbox Code Playgroud)

另请参见GoByExample.

正如下面的评论(以及在zzn回答中),这是一个转换(见规范).
请参阅" 有多贵[]byte(string) "(反向问题,但同样的结论适用)zzzz提到的地方:

有些转换与转换相同uint(myIntvar),只是重新解释了位.

索尼娅补充道:

从字节切片中创建一个字符串,肯定涉及在堆上分配字符串.不变性财产迫使这一点.
有时您可以通过[]字节尽可能多地完成工作来优化,然后在最后创建一个字符串.这种bytes.Buffer类型通常很有用.

  • 对代码的一个小改进是使用“http.StatusOK”而不是原始的“200”值! (2认同)

tsa*_*sch 22

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

func ReadAll(r io.Reader) ([]byte, error)
Run Code Online (Sandbox Code Playgroud)

官方文件

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

body, err := ioutil.ReadAll(resp.Body)
bodyString := string(body)
Run Code Online (Sandbox Code Playgroud)


Alp*_*pha 16

Go 1.16+ 更新(2021 年 2 月)

弃用io/ioutil

代码应该是

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 := io.ReadAll(resp.Body)
    // if u want to read the body many time
    // u need to restore 
    // reader := io.NopCloser(bytes.NewReader(bodyBytes))
    if err != nil {
        log.Fatal(err)
    }
    bodyString := string(bodyBytes)
    log.Info(bodyString)
}
Run Code Online (Sandbox Code Playgroud)

参考

  1. https://golang.org/doc/go1.16#ioutil
  2. /sf/answers/3645372391/