gpt4 book ai didi

go - 将 protobuf 与 golang 结合使用并处理 []byte HTTP 响应正文

转载 作者:数据小太阳 更新时间:2023-10-29 03:06:58 25 4
gpt4 key购买 nike

我正在使用 Golang protobuf 包并尝试编写一些测试以确保我的 API 正常工作。

我使用生成的 .pb.go 文件在服务器端构造一个对象。

并返回

data, err := proto.Marshal(p)
fmt.Fprint(w, data)

在我的测试中我这样做了

func TestGetProduct(t *testing.T) {
log.Println("Starting server")
go startAPITestServer()
time.Sleep(0 * time.Second)
log.Println("Server started")
//rq, err := http.NewRequest("GET", "localhost:8181/product/1", nil)
client := &http.Client{}
log.Println("Starting Request")
resp, err := client.Get("http://localhost:8181/product/1")
log.Println("Finished Request")
if err != nil {
t.Log(err)
}
defer resp.Body.Close()
log.Println("Reading Request")
data, err := ioutil.ReadAll(resp.Body)
log.Println("Reading finished")
if err != nil {
t.Log(err)
}
log.Println("HTTP Resp", data)
p := &Product{}
proto.UnmarshalText(string(data), p)
proto.Unmarshal(data, p2)
}

问题是 HTTP 请求是正确的并正确显示 []byte,但是如果我执行 ioutil.ReadAll,它会将 HTTP 响应解释为字符串,并且将其转换为 []byte

例如响应是

[12 3 2 14 41]

然后 ioutil.ReadAll 将其解释为字符串而不是 []byte

最佳答案

问题是:我试图用 fmt.Fprint 将二进制数据写入输出流,但缺少重要的事实,即 fmt 包转换(所有?)输入为“可读”格式(即字符串)。将数据写入 HTTP 响应输出的正确方法是像这样直接使用响应编写器:

k, err := w.Write(data)

关于go - 将 protobuf 与 golang 结合使用并处理 []byte HTTP 响应正文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30831162/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com