1

我认为我最初的问题(见栏下方)太含糊了。我编造了以下愚蠢的例子来说明我的观点。

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 值。

任何帮助表示赞赏!

4

1 回答 1

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 或重定向。
  • 如果你想显示一个页面,然后在后台下载后重定向,我建议使用带有第三个处理程序的 Javascript,你可以从根处理程序返回的 HTML 页面在后台调用它,并有一个重定向的回调用户一旦完成

例如..:

   +------------+ $.GET +---------------------+   
   | Root page  | ----> |  Background handler |  
   |            |       +---------+-----------+
   |            |                 |
   +------------+ <---Task done---+
         |
         v [redirect using JS]
    +---------------+  
    |/redir/ handler|
    +---------------+

另一种选择可能是使用 iframe 来显示“外国网页”。

于 2013-01-23T07:24:18.787 回答