Jul*_*s F 0 go protocol-buffers
我正在使用 Golang protobuf 包并尝试编写一些测试以确保我的 API 正常工作。
我使用生成的.pb.go
文件在服务器端构建了一个对象。
并返回它
data, err := proto.Marshal(p)
fmt.Fprint(w, data)
Run Code Online (Sandbox Code Playgroud)
在我的测试中我做
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)
}
Run Code Online (Sandbox Code Playgroud)
问题是 HTTP 请求是正确的并正确显示[]byte
,但如果我这样做,ioutil.ReadAll
它会将 HTTP 响应解释为字符串并将其转换为[]byte
.
例如,响应是
[12 3 2 14 41]
Run Code Online (Sandbox Code Playgroud)
然后ioutil.ReadAll
将其解释为字符串而不是[]byte
.
问题是:我试图将二进制数据写入输出流,但fmt.Fprint
遗漏了一个重要的事实,即fmt
包将(一切?)输入转换为“可读”格式(即字符串)。将数据写入 HTTP 响应输出的正确方法是直接使用 responsewriter,如下所示:
k, err := w.Write(data)
Run Code Online (Sandbox Code Playgroud)