如何解决多余的 WriteHeader 并且没有响应
我正在编写一个向 WebSocket 网关发送请求的 HTTP API。我正在使用 go1.14.7
和 gorilla/mux
v1.8.0
。代码将使用 GOOS=linux
GOARCH=arm
GOARM=7
进行交叉编译。
我的问题如下:
-
respondBadRequest()
即使我从不使用WriteHeader
也总是记录这个:http: superfluous response.WriteHeader call from main.(*HttpHandler).respondBadRequest
- API 响应始终为
200 OK
,即使调用respondBadRequest()
也是如此 - API 响应的正文始终为空
我对 Go 完全陌生。下面是我的代码结构。
type HttpHandler struct {
gateway Gateway
}
func (h *HttpHandler) respondSuccess(w http.ResponseWriter,text string) {
w.Write([]byte(text))
}
func (h *HttpHandler) respondBadRequest(w http.ResponseWriter,text string) {
http.Error(w,text,http.StatusBadRequest)
}
func (h *HttpHandler) respondError(w http.ResponseWriter,http.StatusInternalServerError)
}
func (h *HttpHandler) OnFoobar(w http.ResponseWriter,r *http.Request) {
f := func(success bool,e error) {
if e != nil {
h.respondError(w,e.Error())
} else if success {
h.respondSuccess(w,"Foobar Accepted")
} else {
h.respondBadRequest(w,"Unknown Foobar")
}
}
//...
e := h.gateway.Foobar(f)
if e != nil {
log.Println(e)
}
}
//...
httpHandler := &HttpHandler{
gateway: gateway,}
r := mux.NewRouter()
r.HandleFunc("/foobar",httpHandler.OnFoobar)
http.ListenAndServe(":8000",r)
解决方法
因此,正如@mkopriva 指出的那样,f
在 OnFoobar
已经完成并编写了一个隐含的空响应之后很明显被调用。他使用 sync.WaitGroup
修复:
func (h *HttpHandler) OnFoobar(w http.ResponseWriter,r *http.Request) {
wg := new(sync.WaitGroup)
wg.Add(1)
f := func(success bool,e error) {
if e != nil {
h.respondError(w,e.Error())
} else if success {
h.respondSuccess(w,"Foobar Accepted")
} else {
h.respondBadRequest(w,"Unknown Foobar")
}
wg.Done()
}
//...
e := h.gateway.Foobar(f)
if e != nil {
log.Println(e)
}
wg.Wait()
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。