我正在使用 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.
1 回答
人到中年有点甜
TA贡献1895条经验 获得超7个赞
问题是:我试图将二进制数据写入输出流,但fmt.Fprint
忽略了一个重要的事实,即fmt
包将(一切?)输入转换为“可读”格式(即字符串)。将数据写入 HTTP 响应输出的正确方法是直接使用 responsewriter,如下所示:
k, err := w.Write(data)
- 1 回答
- 0 关注
- 364 浏览
添加回答
举报
0/150
提交
取消