0

我正在考虑以下场景:

假设我想要处理程序 X,我在其中进行了一些计算,但现在想在返回请求之前转发到另一个处理程序 Y。

会是这样的

func X(w http.ResponseWriter, r *http.Request, params httprouter.Params){
    //calculations
    if condition{
        var fp httprouter.Params
        fp = append(fp, httprouter.Param{Key: "KEY", Value: "VALUE"})
        w.WriteHeader(301)
        Y(w, r, fp)
        return
    }
}

我遇到的问题是,当页面加载并且它有一个 301 标头时,重定向没有注册。这就像一个 301 的 200 页。

我知道有 http.Redirect,但它不会转发可能有用的参数。有一个简单的解决方案吗?

4

1 回答 1

0

“如果还没有调用 WriteHeader,Write 会在写入数据之前调用 WriteHeader(http.StatusOK)。” (来自http.Server 文档

如果您认为您将重定向,请确保您不向 ResponseWriter 写入任何字节。您可以使用缓冲区或其他东西,而不是直接写入w

至于将你的第一个函数的参数放入你的第二个函数......你可以使用 cookie,或者更简单。重定向路径可以包含参数。作为路径或 GET 变量。这是一个使用您已经在使用的 httprouter 包的路径示例。

在 X() 中,

    if weAreRedirecting {
        http.Redirect(w, r, "/y/"+params.ByName("key"), http.StatusFound)
        return
    }

在你的路由器中, router.GET("/y/:key", Y)

于 2021-01-04T09:17:48.780 回答