我有一个非常简单的Go网络服务器。它的工作是接收入站json有效负载。然后,它将有效负载发布到一个或多个期望字节数组的服务。无需检查有效负载。刚发过来。
在这种情况下,它会收到一个入站作业并将其发送到Google PubSub。它可能是另一项服务 - 它并不重要。 我正在尝试找到最有效的方法将对象转换为字节数组而不先解码它。
为什么呢?在一台服务器上解码并转换为JSON似乎有点浪费,只是稍后解组它。另外,我不想在两个包中保留两个相同的结构。
如何将io.ReadCloser转换为字节数组,因此我只需要解组一次。我尝试了类似这样的答案,但不认为这是最有效的方式:
From io.Reader to string in Go
我的http服务器代码如下所示:
func Collect(d DbManager) http.HandlerFunc {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json; charset=utf-8")
code := 422
obj := Report{}
response := Response{}
response.Message = "Invalid request"
decoder := json.NewDecoder(r.Body)
decoder.Decode(&obj)
if obj.Device.MachineType != "" {
msg,_ := json.Marshal(obj)
if d.Publish(msg, *Topic) {
code = 200
}
response.Message = "Ok"
}
a, _ := json.Marshal(response)
w.WriteHeader(code)
w.Write(a)
return
})
}
答案 0 :(得分:19)
通过阅读将Reader转换为字节。实际上并没有更有效的方法。
body, err := ioutil.ReadAll(r.Body)
如果您无条件地将字节从io.Reader
转移到io.Writer
,则可以使用io.Copy