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

时间:2016-11-11 09:34:53

标签: laravel http redirect go server

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

return Redirect::back();   

POST请求后返回上一个网址。

是否有一种简单的内置方法可以在 Go

中执行此操作
http.Redirect(w, r, backURL, http.StatusSeeOther)

其中backURL是发出POST请求的URL。

我浏览了net/http并搜索了SE和谷歌,但我还没有做任何改变。如果没有一个简单的方法,我会很高兴在 Go 中指出这种做法的惯用方法。

1 个答案:

答案 0 :(得分: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)
}

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

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)
}

然后使用它:

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