Go语言 正在将http.响应传输到http.ResponseWriter

xdnvmnnf  于 2023-02-10  发布在  Go
关注(0)|答案(2)|浏览(160)

我尝试将从API接收到的文件通过管道返回给用户,而不必将其全部存储在内存中。
我在搜索中遇到了不同的概念/想法,如io.Copyio.Pipe()等。我不确定哪一个是正确的解决方案。
例如,io.Pipe()看起来像是用于某人在现场创建新的读写器,而不是已经存在的读写器。

3lxsmp7m

3lxsmp7m1#

io.Copy是实现这一目标的方法,沿着如下:

func pipeReq(rw http.ResponseWriter, req *http.Request) {
    resp, err := http.Get(".....")
    if err != nil{
        //handle the error
        return
    }
    rw.Header().Set("Content-Type", resp.Header.Get("Content-Type"))
    rw.Header().Set("Content-Length", resp.Header.Get("Content-Length"))
    io.Copy(rw, resp.Body)
    resp.Body.Close()

}

//edit:误读了问题,现在修复了代码。

vaj7vani

vaj7vani2#

@OneOfOne的答案很好,但有一个小的改进是使用io.CopyBuffer。CopyBuffer与Copy相同,只是它通过提供的缓冲区(如果需要)而不是分配临时缓冲区

func pipeReq(rw http.ResponseWriter, req *http.Request) {
    resp, err := http.Get(".....")
    if err != nil{
        //handle the error
        return
    }
    rw.Header().Set("Content-Type", resp.Header.Get("Content-Type"))
    rw.Header().Set("Content-Length", resp.Header.Get("Content-Length"))  
    buf := make([]byte, 8)
    if _, err := io.CopyBuffer(rw, resp.Body, buf); err != nil {
        // handle the error
        return
    }
    resp.Body.Close()   
}

相关问题