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 サービス」と通信して応答を決定します。

通常、「外部 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 の値を取得する必要があるかもしれません。

どんな助けでも大歓迎です!

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またはリダイレクトを変更する必要があります。
  • ページを表示し、ダウンロードがバックグラウンドで発生した後にリダイレクトする場合は、ルートハンドラーから返されたHTMLページからバックグラウンドで呼び出すことができる3番目のハンドラーでJavascriptを使用し、リダイレクトするコールバックを使用することをお勧めします一度行ったユーザー

例えば..:

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

別のオプションは、おそらくiframeを使用して「外部Webページ」を表示することです。

于 2013-01-23T07:24:18.787 に答える