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

新手上路,请多包涵

我想解析 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 将响应正确写入文件。

我已经检查了包参考,但它并不是很有帮助。

原文由 Tibor Szasz 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 715
2 个回答

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

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

有点像 这个线程

(在 Go 1.16 之后更新 – 2021 年第一季度 – ioutil 弃用ioutil.ReadAll() => io.ReadAll() ):

 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 err != nil {
        log.Fatal(err)
    }
    bodyString := string(bodyBytes)
    log.Info(bodyString)
}

另请参阅 GoByExample

正如下面的评论(以及 zzn回答),这是一个 转换(参见 规范)。

请参阅“ How expensive is []byte(string) ? ”(反向问题,但同样的结论适用) zzzz 提到的地方:

一些转换与转换相同,例如 uint(myIntvar) ,它只是重新解释位。

索尼娅 补充道:

从字节切片中创建一个字符串,肯定涉及在堆上分配字符串。不变性属性迫使这一点。

有时你可以通过使用 []byte 做尽可能多的工作然后在最后创建一个字符串来优化。 bytes.Buffer 类型通常很有用。

原文由 VonC 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

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

官方文件

您可以使用以下方法将 []byte 转换为字符串

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

原文由 tsabsch 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题