Web套接字连接中的Http重定向[现在更好地解释]

时间:2013-01-21 21:18:02

标签: go

我认为我原来的问题(见下面栏)太模糊了。我做了以下愚蠢的事 这个例子显示了我的观点。

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

感谢任何帮助!

1 个答案:

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

例如......:

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

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