猿问

将 protobuf 与 golang 一起使用并处理 []byte HTTP 响应正文

我正在使用 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.


ABOUTYOU
浏览 365回答 1
1回答

人到中年有点甜

问题是:我试图将二进制数据写入输出流,但fmt.Fprint忽略了一个重要的事实,即fmt包将(一切?)输入转换为“可读”格式(即字符串)。将数据写入 HTTP 响应输出的正确方法是直接使用 responsewriter,如下所示:k, err := w.Write(data)
随时随地看视频慕课网APP

相关分类

Go
我要回答