gpt4 book ai didi

go - 如何处理多余的 response.WriteHeader 调用以返回 500

转载 作者:数据小太阳 更新时间:2023-10-29 03:18:15 27 4
gpt4 key购买 nike

我知道 http.ResponseWriterWriteHeader 方法每个 HTTP 响应只能调用一次,只能有一个响应状态代码,并且只能发送一次 header 。这一切都很好。

问题是,如果 http.ResponseWriter.Write 返回一个错误?正如您在下面看到的那样,我故意强制 panic 以查看如何 httprouter.Router.PanicHandler处理它。正如预期的那样,日志显示 http: superfluous response.WriteHeader call from ... 并且响应为 201,因为如上所述为时已晚。

package server

import (
"github.com/julienschmidt/httprouter"
"log"
"net/http"
)

func Serve() {
rtr := httprouter.New()
rtr.GET("/", home.Welcome)

handle500(rtr)

err := http.ListenAndServe(":8080", rtr)
if err != nil {
log.Fatalf("server crash")
}
}

func handle500(r *httprouter.Router) {
r.PanicHandler = func(res http.ResponseWriter, req *http.Request, err interface{}) {
res.WriteHeader(http.StatusInternalServerError)
// http: superfluous response.WriteHeader call from line above
}
}
package home

import (
"github.com/julienschmidt/httprouter"
"net/http"
)

func Welcome(res http.ResponseWriter, _ *http.Request, _ httprouter.Params) {
// doing a few bits and building the body

res.Header().Set("Content-Type", "application/json")
res.WriteHeader(201)

_, err := res.Write("body goes here")
if err == nil { // I am doing this deliberately to test 500
panic("assume that something has gone wrong with res.Write and an error occurred")
}
}

最佳答案

无法“覆盖”状态代码,因为它会立即发送到浏览器。

您正在检查 http.ResponseWriter.Write() 的返回值。我不确定这是一个好策略。如果写入响应失败,那么写入更多响应也可能会失败。

记录失败似乎更合适,但我希望大多数失败是连接断开和其他不需要操作的错误。

关于go - 如何处理多余的 response.WriteHeader 调用以返回 500,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57828645/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com