我认为我最初的问题(见栏下方)太含糊了。我编造了以下愚蠢的例子来说明我的观点。
package main
import (
"fmt"
"net/http"
"time"
)
func main() {
http.HandleFunc("/redir", redirHandler)
http.HandleFunc("/", rootHandler)
_ = http.ListenAndServe("localhost:4000", nil)
}
func redirHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "hello, this is redir which will host the foreign html page")
}
func rootHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "hello, this is root")
// at some point "foreign webserver" sends me a complete
// html page.
// I want to serve this page at "/redir/", and I feel my
// best shot is to redirect to "/redir"
time.Sleep(2 * time.Second)
http.Redirect(w, r, "/redir/", http.StatusFound)
}
此代码不起作用,因为我无法重新使用 w 来执行重定向。那么,在这种情况下是否可以重定向,例如通过另一个 http 包调用?
我希望我已经把自己说清楚了...
提前致谢
克里斯
我正在以下配置中的“我的服务器”上工作
[web browser client] -- [my server] -- [foreign webservice]
“我的服务器”为“Web 浏览器客户端”提供以下内容
func main() {
http.HandleFunc("/launch", launchHandler)
http.HandleFunc("/", rootHandler)
http.Handle("/socket", websocket.Handler(socketHandler))
err := http.ListenAndServe(listenAddr, nil)
if err != nil {
log.Fatal(err)
}
}
RootHandler向“web浏览器客户端”写入一个html页面,socketHandler在“web浏览器客户端”和“我的服务器”之间建立websocket连接。
来自“Web 浏览器客户端”的请求通过 Web 套接字连接到达并由“我的服务器”处理,“我的服务器”与“外部 Web 服务”通信以确定响应。
通常,“外国网络服务”会提供一些数据,“我的服务器”使用这些数据来响应“网络浏览器客户端”。
在某些情况下,“外部网络服务”会以完整的 html 页面进行响应。
我不确定如何将此类 html 页面传达给“网络浏览器客户端”
到目前为止,我最好的猜测是执行 http.Redirect() 到 launchHandler 以便 launchHandler 可以将从“外国 Web 服务器”获得的 html 页面写入“Web 浏览器客户端”。(关闭 web socket 连接时没有问题。)
为此,我使用 http.ResponseWriter、*http.Request 作为 httpRedirect 的参数,这些参数首先在 rootHandler 中接收。
这不起作用并产生日志消息:“http:multiple response.WriteHeader calls”
对于如何解决这个问题,有任何的建议吗?也许我执行 http.Redirect 的方法是错误的;也许我应该获取其他 http.ResponseWriter 和/或 *http.Request 值。
任何帮助表示赞赏!