2016-11-22 129 views
0

這裏http響應是模式:寫入管讀數到golang

客戶端發送POST請求到服務器A

服務器A進程的這一和發送GET到服務器B

服務器B發送通過一個響應到客戶端


不過,我覺得最好的辦法是讓這將讀取的GET的響應,並寫入到POST的響應管道,但我有很多類型的問題。

func main() { 
    r := mux.NewRouter() 
    r.HandleFunc("/test/{hash}", testHandler) 

    log.Fatal(http.ListenAndServe(":9095", r)) 
} 

func handleErr(err error) { 
    if err != nil { 
     log.Fatalf("%s\n", err) 
    } 
} 


func testHandler(w http.ResponseWriter, r *http.Request){ 

    fmt.Println("FIRST REQUEST RECEIVED") 
    vars := mux.Vars(r) 
    hash := vars["hash"] 
    read, write := io.Pipe() 

    // writing without a reader will deadlock so write in a goroutine 
    go func() { 
     write, _ = http.Get("http://localhost:9090/test/" + hash) 
     defer write.Close() 
    }() 

    w.Write(read) 
} 

當我運行此我得到以下錯誤:

./ReverseProxy.go:61:不能在參數中使用讀取(鍵入* io.PipeReader)類型[]字節w.Write

有沒有辦法,以正確地插入到http響應io.PipeReader格式? 還是我以完全錯誤的方式做這件事?

+1

我認爲你誤解了一個io.Pipe的目的。爲什麼不直接將響應中的數據複製到ReponseWriter? (同樣,一個http.Response沒有Close方法,你用http.Response跟蹤PipeWriter,你需要首先檢查錯誤) – JimB

回答

3

你實際上沒有寫信給它,你正在替換管道的寫入。

func testHandler(w http.ResponseWriter, r *http.Request) { 

    fmt.Println("FIRST REQUEST RECEIVED") 

    vars := mux.Vars(r) 
    hash := vars["hash"] 

    read, write := io.Pipe() 

    // writing without a reader will deadlock so write in a goroutine 
    go func() { 
     defer write.Close() 
     resp, err := http.Get("http://localhost:9090/test/" + hash) 
     if err != nil { 
      return 
     } 
     defer resp.Body.Close() 
     io.Copy(write, resp.Body) 

    }() 

    io.Copy(w, read) 

} 

雖然,我與@JimB同意,對於這種情況下,甚至沒有必要管,這樣的事情應該是更有效:

func testHandler(w http.ResponseWriter, r *http.Request) { 
    vars := mux.Vars(r) 
    hash := vars["hash"] 

    resp, err := http.Get("http://localhost:9090/test/" + hash) 
    if err != nil { 
     // handle error 
     return 
    } 
    defer resp.Body.Close() 

    io.Copy(w, resp.Body) 
} 
沿線的

東西

+2

雖然這個io.Pipe失敗沒有意義,這是隻是一個io.Copy更多的副本。 – JimB

+1

@JimB我同意,但我想他可能會試圖學習如何使用它,我會添加另一個剪輯沒有它。 – OneOfOne