在golang

时间:2016-11-22 16:38:39

标签: http go pipe mux

这是架构:

客户端向服务器A发送POST请求

服务器处理此过程并将GET发送到服务器B

服务器B通过A向客户端发送响应

我最好的想法是制作一个可以读取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:不能使用read(type * io.PipeReader)作为w.Write参数中的[]字节类型

有没有办法将io.PipeReader格式正确插入到http响应中? 或者我是以完全错误的方式做到这一点?

1 个答案:

答案 0 :(得分:4)

你实际上并没有写它,你正在替换管道的写作。

有些事情:

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)
}