元の質問 (バーの下を参照) が漠然としすぎていたと思います。私は、私の主張が何であるかを示す次のばかげた例を作成しました。
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 サービス」と通信して応答を決定します。
通常、「外部 Web サービス」は、「私のサーバー」が「Web ブラウザ クライアント」に応答するために使用する少量のデータを提供します。
場合によっては、「外部 Web サービス」が完全な html ページで応答します。
そのようなhtmlページを「Webブラウザクライアント」に伝える方法がわかりません
これまでのところ、http.Redirect() を launchHandler に実行して、launchHandler が「外部 Web サーバー」から取得した html ページを「Web ブラウザー クライアント」に書き込むことができるようにすることをお勧めします。(Web ソケット接続が閉じている場合は問題ありません。)
そのために、最初に rootHandler で受け取った http.ResponseWriter、*http.Request を httpRedirect へのパラメーターとして使用します。
これは機能せず、ログ メッセージ「http: 複数の response.WriteHeader 呼び出し」が生成されました。
これを修正する方法について何か提案はありますか? http.Redirect を実行する私のアプローチが間違っている可能性があります。別の http.ResponseWriter や *http.Request の値を取得する必要があるかもしれません。
どんな助けでも大歓迎です!