将protobuf与golang一起使用并处理[]字节的HTTP响应体
我正在使用Golang protobuf包,并尝试编写一些测试来确保我的API正常工作 我使用生成的将protobuf与golang一起使用并处理[]字节的HTTP响应体,go,protocol-buffers,Go,Protocol Buffers,我正在使用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
.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请求是正确的,并且正确地显示了[]字节
,但是如果我执行了ioutil.ReadAll
,它会将HTTP响应解释为字符串,并将其转换为[]字节
例如,响应是
[12 3 2 14 41]
然后,
ioutil.ReadAll
将其解释为一个字符串,而不是一个[]字节问题是:我试图用fmt.Fprint
将二进制数据写入输出流,但忽略了一个重要事实,fmt
包将(所有?)输入转换为“可读取”格式(即字符串)。
将数据写入HTTP响应输出的正确方法是直接使用responsewriter,如下所示:
k, err := w.Write(data)
问题是:我试图用fmt.Fprint
将二进制数据写入输出流,但忽略了一个重要事实,fmt
包将(所有?)输入转换为“可读取”格式(即字符串)。
将数据写入HTTP响应输出的正确方法是直接使用responsewriter,如下所示:
k, err := w.Write(data)
在log.Println(data)
中,如果希望将字节片格式化为其他字节片,则需要转换(例如string(data)
)或使用格式化(例如log.Printf(“HTTP Resp:%02X”,data)
,或“%s”
可能)。@DaveC问题不在于它通过HTTP发送[]字节数据的日志,接收此[]字节数据并在日志中将其编码回正确的[]字节数据。Println(数据)
如果您希望将字节片格式化为其他字节片,则需要转换(例如字符串(数据)
)或使用格式化(例如log.Printf(“HTTP Resp:%02X,Data)
,或%s”
)@DaveC问题不在于日志,它通过HTTP发送[]字节数据,接收[]字节数据并将其编码回正确的[]字节数据