猿问

Web套接字连接中的Http重定向

我认为我最初的问题(参见下面的栏)太模糊了。我编造了以下愚蠢的例子,说明了我的意思。


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将一个html页面写入“ Web浏览器客户端”,而socketHandler在“ Web浏览器客户端”和“我的服务器”之间建立一个websocket连接。


来自“ Web浏览器客户端”的请求通过Web套接字连接到达,并由“我的服务器”处理,“我的服务器”与“外部Web服务”进行通信以确定响应。


通常,“外部网络服务”会提供一些数据,“我的服务器”会使用这些数据来响应“网络浏览器客户端”。


在某些情况下,“外国网络服务”以完整的 html 页面响应。


我不确定如何将此类html页面传达给“网络浏览器客户端”


到目前为止,我最好的猜测是对launchHandler执行一个http.Redirect(),以便launchHandler可以将从“外国Web服务器”获得的html页面写入“ Web浏览器客户端”。(关闭Web套接字连接时没有问题。)


为此,我首先使用了rootHandler中的http.ResponseWriter,* http.Request作为httpRedirect的参数。


这不起作用,并产生日志消息:“ http:多个响应。WriteHeader调用”


对于如何解决这个问题,有任何的建议吗?也许我执行http.Redirect的方法是错误的;也许我应该获取其他http.ResponseWriter和/或* http.Request值。


四季花海
浏览 216回答 1
1回答
随时随地看视频慕课网APP

相关分类

Go
我要回答