我认为我原来的问题(见下面栏)太模糊了。我做了以下愚蠢的事 这个例子显示了我的观点。
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]
“我的服务器”向“网络浏览器客户端”提供以下内容
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将html页面写入“web浏览器客户端”和socketHandler 在“web浏览器客户端”和之间建立websocket连接 “我的服务器”。
来自“Web浏览器客户端”的请求通过Web套接字连接到达 由“我的服务器”处理,“我的服务器”与“外部web服务”通信 确定回应。
通常,“foreign webservice”会提供一些使用的数据 “我的服务器”回复“网络浏览器客户端”。
在某些情况下,“外国网络服务”会以完整的html页面进行响应。
我不知道如何将这样的html页面传达给“网页浏览器客户端”
到目前为止,我最好的猜测是执行一个http.Redirect()来启动这个 launchHandler可以编写从“外部Web服务器”获取的html页面 到“网络浏览器客户端”。 (关闭Web套接字连接时没问题。)
为了做到这一点,我使用http.ResponseWriter,* http.Request作为参数 到httpRedirect,它首先在rootHandler中收到。
这不起作用并产生日志消息:“http:multiple response.WriteHeader calls”
有关如何解决此问题的任何建议?也许我的方法来执行http.Redirect 是错的;也许我应该获得另一个http.ResponseWriter和/或* http.Request 值。
感谢任何帮助!
答案 0 :(得分:2)
您需要从您提供的新示例中更改一些内容:
一旦调用fmt.Fprint,就会返回一个响应,从而返回一个标题(状态码为200)。查看http://golang.org/pkg/net/http/#ResponseWriter
// Changing the header after a call to WriteHeader (or Write) has no effect.
如果您想要简单的重定向,请忽略fmt.Fprint(w, "hello, this is root")
。
/redir
和/redir/
是不同的端点。您需要更改处理程序的URL或重定向。例如......:
+------------+ $.GET +---------------------+
| Root page | ----> | Background handler |
| | +---------+-----------+
| | |
+------------+ <---Task done---+
|
v [redirect using JS]
+---------------+
|/redir/ handler|
+---------------+
另一种选择可能是使用iframe来显示“外国网页”。