假设我有一个按钮,它将打开一个新页面。该按钮的操作由对Golang API的AJAX调用处理。该Golang API由中间件Verify
包装,该中间件将在定向到该页面之前验证所有内容。传递给中间件的函数中定义的页面正在使用Golang HTML模板。
router.GET("/newpage", Verify(newpageHandler))
func Verify(h http.HandlerFunc) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
//verify everything here
//if all verify, call newpageHandler to redirect to new page
h.ServeHTTP(w,r)
}
}
func newpageHandler(w http.ResponseWriter, r *http.Request) {
//this handler will process the html template
}
当我单击按钮(对/newpage
的AJAX调用)时,它不会打开新页面,而仅返回newpageHandler
处理程序中的HTML内容。我可以看到浏览器开发人员工具返回的HTML,但没有在newpageHandler
中定义新页面。
可以使用http.Redirect
吗?
答案 0 :(得分:1)
如果要更改页面,那么AJAX并不是您想要的。代替向API发送AJAX请求,您应该使用以下方法之一将浏览器重定向到该API:
HTML:
<a href="url/to/my/api">Go To page</a>
Javascript:
window.location = "url/to/my/api"
答案 1 :(得分:1)
AJAX调用将隐式地跟随重定向。 las,没有办法防止这种情况。因此,使用http.Redirect
并不是一个好的选择。
您可以在“验证”功能中用信号表示是否接受了请求。使用http状态代码可以轻松完成此操作。如果一切正常,则可以返回2xx代码。如果出现错误,您可以返回4xx代码。
func Verify(h http.HandlerFunc) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
//verify everything here. verifcationFunc() returns a bool
if verifcationFunc() {
w.WriteHeader(http.StatusOK)
} else {
w.WriteHeader(http.StatusUnauthorized)
}
}
}
您现在可以在JavaScript中评估返回的状态代码。在200上,您可以在JavaScript中设置新位置。可以使用window.location
完成。在401代码上(在上面的示例中),您可以输出错误消息。