登录
首页 >  Golang >  Go问答

在Go中将HTTP响应流式化传输到http.ResponseWriter

来源:stackoverflow

时间:2024-02-22 14:12:17 146浏览 收藏

本篇文章主要是结合我之前面试的各种经历和实战开发中遇到的问题解决经验整理的,希望这篇《在Go中将HTTP响应流式化传输到http.ResponseWriter》对你有很大帮助!欢迎收藏,分享给更多的需要的朋友学习~

问题内容

我想将 http get 响应流式传输到 http 响应编写器。我在网上搜索了解决方案,最后使用了 io.copy 。但它不是流式传输,而是下载整个 get 响应,然后传递给 http 响应编写器。我被这个问题困扰了2天。如果你知道的话请帮帮我。下面是示例代码

package main

import (
    "fmt"
    "io"
    "net/http"
    "time"

    "github.com/gorilla/mux"
)

func main() {
    router := mux.NewRouter()
    router.Path("/test").HandlerFunc(Stream).Methods("GET")

    srv := &http.Server{
        Addr:         ":4000",
        Handler:      router,
        ReadTimeout:  30 * time.Minute,
        WriteTimeout: 30 * time.Minute,
        IdleTimeout:  60 * time.Minute,
    }

    srv.SetKeepAlivesEnabled(true)

    fmt.Println(srv.ListenAndServe())
}

// Stream .
func Stream(w http.ResponseWriter, r *http.Request) {
    req, err := http.NewRequest("GET", "https://lh3.googleusercontent.com/k3ysodYwXwhm7ThrM_-zbqhETk8CUfMd5vuG9RbjBKrKAKQaUfZpiRRDg8ZEaT-WfsDkRfS_cheTM4JvT3TEoNEPF4gzofkq0Y6ykGVT_WhG4hXG-nAdkpeyeY1kMysqBWdS5YDGIPY=d", nil)
    if err != nil {
        return
    }

    client := &http.Client{}
    resp, err := client.Do(req)
    if err != nil {
        return
    }
    defer resp.Body.Close()

    w.Header().Set("content-type", "video/mp4")
    w.WriteHeader(206)
    w.Header().Set("Status", "206")

    i, err := io.Copy(w, resp.Body)
    fmt.Println(i, err)
}

正确答案


使用 io.Copy 将 http 请求正文的内容流式传输到响应正文。我不确定你为什么不这么认为。

此外,请将您的代码直接发布在问题中,而不是发布在外部链接中。

终于介绍完啦!小伙伴们,这篇关于《在Go中将HTTP响应流式化传输到http.ResponseWriter》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布Golang相关知识,快来关注吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>