J'ai un serveur Web Go très simple. Son travail consiste à recevoir une charge utile json entrante. Il publie ensuite la charge utile vers un ou plusieurs services qui attendent un tableau d'octets. La charge utile n'a pas besoin d'être vérifiée. Je viens de m'envoyer.
Dans ce cas, il reçoit un travail entrant et l'envoie à Google PubSub. Ce pourrait être un autre service - cela n'a pas vraiment d'importance. J'essaie de trouver le moyen le plus efficace de convertir l'objet en un tableau d'octets sans d'abord le décoder.
Pourquoi? Semble un peu inutile de décoder et de convertir en JSON sur un serveur, pour le démarsaler plus tard. De plus, je ne veux pas conserver deux structures identiques dans deux packages.
Comment est-il possible de convertir l'io.ReadCloser en un tableau d'octets donc je n'ai besoin de démarsaler qu'une seule fois. J'ai essayé quelque chose comme cette réponse, mais je ne pense pas que ce soit le moyen le plus efficace non plus:
De io.Reader à la chaîne dans Go
Mon code de serveur http ressemble à ceci:
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
})
}
Vous convertissez un Reader en octets, en le lisant. Il n'y a pas vraiment de moyen plus efficace de le faire.
body, err := ioutil.ReadAll(r.Body)
Si vous transférez sans condition des octets à partir d'un io.Reader
à un io.Writer
, vous pouvez simplement utiliser io.Copy