<p>Hi all,</p>
<p>I am new to Go and would like suggestions on how to share values between middleware.</p>
<p>I currently am writing a JSON body parser middleware for my api and don't really know how to share values to the next handler call. So my code looks something like this:</p>
<pre><code>// BodyParser parses incoming JSON requests
func BodyParser(val {}interface, next http.Handler, w http.ResponseWriter, req *http.Request) error {
type := reflect.TypeOf(val)
val := reflect.New(type).Interface()
err := json.NewDecoder(r.Body).Decode(val)
if (err != nil) {
// handle error here
}
// best way of storing shared middleware value?
next.ServeHTTP(w,r)
return nil
}
</code></pre>
<p>I was thinking of using Context, but I read some articles that said using context is a bad idea, so I am wondering if there are other ways of doing it without using Context? Any suggestions would be great, thanks!</p>
<hr/>**评论:**<br/><br/>TheMerovius: <pre><p>Why do this as a middleware? There seems to be no actual value provided. I'd just use a function</p>
<pre><code>func ParseBody(v interface{}, req *http.Request, res http.ResponseWriter) error {
if err := json.NewDecoder(r.Body).Decode(v); err != nil {
// handle error here
}
return nil
}
</code></pre>
<p>and call that from a handler.</p></pre>freetoplay123: <pre><p>I didn't know this was the best way of handling JSON request body in Go. Coming from other languages, they always had a JSON parser middleware. Thanks for the info!</p></pre>joncalhoun: <pre><p>I have mixed feelings about the approach you are taking, but this article may help give you a few ideas - <a href="https://www.calhoun.io/pitfalls-of-context-values-and-how-to-avoid-or-mitigate-them/" rel="nofollow">https://www.calhoun.io/pitfalls-of-context-values-and-how-to-avoid-or-mitigate-them/</a></p>
<p>Context values aren't bad by themselves, and they are pretty useful for middleware, but you just need to use some caution with them and not throw everything under the sun in a context value</p>
<p>If you have follow-up questions let me know - I wrote the linked article.</p></pre>freetoplay123: <pre><p>Thanks, this gave me a better understanding of Context.</p></pre>tgulacsi: <pre><p>Use a struct and define the handler as method. This way you can store anything on the struct.
But I'd prefer the github.com/go-kit/kit way: have a Decoder which decodes the http request, and returns a nicely filled struct; have an Endpoint which receives that processed struct, does its job, then returns another struct with the data to be returned; then have an Encoder, which outputs as needed from the struct into the ResponseWriter.</p></pre>
这是一个分享于 的资源,其中的信息可能已经有所发展或是发生改变。
入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889
- 请尽量让自己的回复能够对别人有帮助
- 支持 Markdown 格式, **粗体**、~~删除线~~、
`单行代码`
- 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
- 图片支持拖拽、截图粘贴等方式上传