这是架构:
客户端向服务器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响应中? 或者我是以完全错误的方式做到这一点?
答案 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)
}