Can Go可以轻松模拟Laravel返回Redirect :: back()的行为吗?

Pau*_*ker 2 redirect http go laravel server

使用Laravel时,我真的很感激能够使用:

return Redirect::back();   
Run Code Online (Sandbox Code Playgroud)

POST请求后返回上一个URL .

Go中有一个简单的内置方法吗?

http.Redirect(w, r, backURL, http.StatusSeeOther)
Run Code Online (Sandbox Code Playgroud)

backURLPOST请求的URL 在哪里.

我查看net/http并搜索了SE和谷歌,但我没有提出任何建议.如果没有一个简单的方法,我会很感激任何指向Go的惯用方法.

icz*_*cza 5

Redirect::back()函数使用Referer客户端(浏览器)指定的HTTP标头中的URL .

您可以像访问此标头值一样访问此类标头值r.Header.Get("Referer"),但该http.Request类型还提供了一个Request.Referer()返回此Referer字段值的直接方法,该方法还处理其两种可能的形式("Referer""Referrer").

这就是你如何模仿"回归"的行为:

func PostHandler(w http.ResponseWriter, r *http.Request) {
    // Process form, then:
    if rf := r.Referer(); rf != "" {
        http.Redirect(w, r, rf, http.StatusSeeOther)
        return
    }

    // No Referer specified, supply your own response
    // or redirect to a default / home page
    http.Redirect(w, r, "/", http.StatusSeeOther)
}
Run Code Online (Sandbox Code Playgroud)

如果要从许多处理程序中调用它,可以在辅助函数中捕获此功能:

func redirectBack(w http.ResponseWriter, r *http.Request) {
    if rf := r.Referer(); rf != "" {
        http.Redirect(w, r, rf, http.StatusSeeOther)
        return
    }

    // No Referer specified, supply your own response
    // or redirect to a default / home page
    http.Redirect(w, r, "/", http.StatusSeeOther)
}
Run Code Online (Sandbox Code Playgroud)

然后使用它:

func PostHandler(w http.ResponseWriter, r *http.Request) {
    // Process form, then:
    redirectBack(w, r)
}
Run Code Online (Sandbox Code Playgroud)