将protobuf与golang一起使用并处理[]字节的HTTP响应体

将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

我正在使用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请求是正确的,并且正确地显示了
[]字节
,但是如果我执行了
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发送[]字节数据,接收[]字节数据并将其编码回正确的[]字节数据