【问题标题】:Using protobuf with golang and handling []byte HTTP response body将 protobuf 与 golang 一起使用并处理 []byte HTTP 响应正文
【发布时间】:2015-06-14 15:28:27
【问题描述】:

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

【问题讨论】:

  • 在您的log.Println(data) 中,如果您希望将字节切片格式化为其他字节切片,则需要进行隐蔽(例如string(data))或使用格式化(例如log.Printf("HTTP Resp: % 02X", data) 或@ 987654333@也许)。
  • @DaveC 问题不在于它通过 HTTP 发送 []byte 数据的日志,接收此 []byte 数据并将其编码回正确的 []byte 数据

标签: go protocol-buffers


【解决方案1】:

问题是:我试图将二进制数据写入输出流,而 fmt.Fprint 缺少一个重要的事实,即 fmt 包将(一切?)输入转换为“可读”格式(即字符串) . 将数据写入 HTTP 响应输出的正确方法是直接使用 responsewriter,如下所示:

k, err := w.Write(data)

【讨论】:

    猜你喜欢
    • 2017-12-18
    • 1970-01-01
    • 1970-01-01
    • 2019-08-03
    • 2019-02-03
    • 1970-01-01
    • 2015-05-15
    • 2011-04-17
    • 1970-01-01
    相关资源
    最近更新 更多