如何接收流式传输的 HTTP 响应

2023-12-27

当使用 Go 抛出 HTTP 请求并接收响应时,考虑到 ResponseBody 很大(1 GB 或更多)的情况,我希望在流式传输时接收响应。

resp, err: = http.Client.Do(req)

在这种情况下,如果正文很大,我无法读取标题,并且不知道响应的状态。 有什么解决办法吗?


(编辑:如果您无法从响应中获取“Content-length”标头,则您所访问的 Web 服务可能不会返回该标头。在这种情况下,无法知道响应正文的长度而不完全读取它。您可以在以下示例中通过删除在响应中设置 Content-length 标头的行来模拟这一点。)

标准围棋net/http包可以很好地处理大型响应。这是一个独立的示例来演示:

// Start a mock HTTP server that returns 2GB of data in the response. Make a
// HTTP request to this server and print the amount of data read from the
// response.
package main

import (
    "fmt"
    "io"
    "log"
    "net/http"
    "strings"
    "time"
)

const oneMB = 1024 * 1024
const oneGB = 1024 * oneMB
const responseSize = 2 * oneGB

const serverAddr = "localhost:9999"

func startServer() {
    // Mock HTTP server that always returns 2GB of data
    go http.ListenAndServe(serverAddr, http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
        w.Header().Set("Content-length", fmt.Sprintf("%d", responseSize))

        // 1MB buffer that'll be copied multiple times to the response
        buf := []byte(strings.Repeat("x", oneMB))

        for i := 0; i < responseSize/len(buf); i++ {
            if _, err := w.Write(buf); err != nil {
                log.Fatal("Failed to write to response. Error: ", err.Error())
            }
        }
    }))

    // Some grace period for the server to start
    time.Sleep(100 * time.Millisecond)
}

func main() {
    startServer()

    // HTTP client
    req, err := http.NewRequest("GET", "http://"+serverAddr, nil)
    if err != nil {
        log.Fatal("Error creating HTTP request: ", err.Error())
    }

    client := http.Client{}
    resp, err := client.Do(req)
    if err != nil {
        log.Fatal("Error making HTTP request: ", err.Error())
    }

    // Read the response header
    fmt.Println("Response: Content-length:", resp.Header.Get("Content-length"))

    bytesRead := 0
    buf := make([]byte, oneMB)

    // Read the response body
    for {
        n, err := resp.Body.Read(buf)
        bytesRead += n

        if err == io.EOF {
            break
        }

        if err != nil {
            log.Fatal("Error reading HTTP response: ", err.Error())
        }
    }

    fmt.Println("Response: Read", bytesRead, "bytes")
}

如果响应太大,您不会想读取内存中的整个响应。将其写入临时文件,然后进行处理。

相反,如果您正在寻找在网络不太可靠时可靠地执行此操作的选项,请查找“HTTP 范围请求”,您可以使用它来恢复部分下载的数据。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何接收流式传输的 HTTP 响应 的相关文章

  • golang中通道缓冲容量0和1的区别

    我已将通道缓冲区大小设置为零 例如var intChannelZero make chan int 当从intChannelZero将被阻止 直到intChannelZero有价值 另外 我将通道缓冲区大小设置为 1 例如var intCh
  • C# HTTP 请求解析器[重复]

    这个问题在这里已经有答案了 可能的重复 将原始 HTTP 请求转换为 HTTPWebRequest 对象 https stackoverflow com questions 318506 converting raw http reques
  • 以 REST 方式更新整个资源集合

    我有一个资源列表的 REST URI 例如 http foo com group users 这些用户中的每一个都有一个序列号 我想公开一种方法来为集合中的所有用户重新编号这些值 并使访问该列表的每个人都可以使用此更改 由于这是对整个集合的
  • 客户端/服务器使用哪些 Cache-Control 标头值?

    我试图了解哪些值Cache Control将在请求中使用 并将在响应中使用 This https stackoverflow com questions 42652931 why use cache control header in re
  • cookie 在会话结束时或在特定时间过期?

    cookie 是否可以在会话结束时或在特定时间过期 是的 这很简单 HttpCookie newCookie new HttpCookie myCookie newCookie Expires DateTime Today AddDays
  • 使用.pem文件在java中发送https请求

    我有包含证书 私钥和信任链的 pem 文件 以及我使用它生成的 p12 文件openssl pkcs12 导出 openssl pkcs12 export out file p12 in file pem inkey file pem pa
  • 有没有办法间歇性地执行重复性任务?

    有没有办法在 Go 中执行重复的后台任务 我在想类似的事情Timer schedule task delay period 在爪哇 我知道我可以用 goroutine 来做到这一点Time sleep 但我想要一些容易停止的东西 这是我得到
  • Go 编译器有窗口化设置选项吗?

    我正在使用 Go 6g 编译 GTK 应用程序 我想知道是否有编译器 链接器选项使其成为 Windows 可执行文件而不是控制台可执行文件 MinGW 有一个 mwindows 选项来实现此目的 目前我必须使用十六进制编辑器手动更改 PE
  • 使用 Java 通过 HTTP 下载未知长度的文件

    我想用java下载一个HTTP查询 但是我下载的文件在下载时有一个未确定的长度 我认为这将是相当标准的 所以我搜索并找到了它的代码片段 http snipplr com view 33805 http snipplr com view 33
  • container_memory_working_set_bytes 与 process_resident_memory_bytes 和total_rss 之间的关系

    我希望了解以下关系 容器内存工作集字节 vs 进程驻留内存字节 vs 总计RSS 容器内存 rss 文件映射以便更好地配备OOM可能性警报系统 这似乎违背了我的理解 这让我现在感到困惑 如果容器 pod 运行单个进程 执行用 Go 编写的编
  • 不加载隐藏图像

    我的网站上有一堆隐藏图像 它们的容器 DIV 具有 style display none 根据用户的操作 某些图像可能会通过 JavaScript 显示 问题是我的所有图像都是在打开页面时加载的 我想通过仅加载最终可见的图像来减轻服务器的压
  • 是什么导致“线程被中止”异常随机发生并向浏览器显示 HTTP 标头和部分 HTML?

    发生的情况偶尔是随机的 而不是像您期望的那样将 HTML 返回到浏览器 它看起来有点像这样 线程正在中止 HTTP 1 1 200 OK 标题的其余部分 如 HTML 的 1 10 就是这样 他们实际上在浏览器窗口中收到了一堆文本 它不会一
  • 防止表单重新提交

    第一页包含一个 HTML 表单 第二页 处理提交的数据的代码 第一页中的表格已提交 浏览器被重定向到第二页 第二页处理提交的数据 此时 如果刷新第二页 则会弹出 确认表单重新提交 警报 这可以预防吗 人们过去常采取两种方法 方法一 使用 A
  • 如何找出数据包的HTTP头长度?

    我知道如何手动执行此操作 通过查看十六进制转储 我怎样才能自动获得相同的信息 我必须使用 API 吗 我有wireshark 和Microsoft 网络监视器 这可以通过简单地实现Lua解析器 http wiki wireshark org
  • 将中间件与 Golang Gorilla mux 子路由器结合使用

    如何将中间件应用到 Go 中大猩猩工具包 http www gorillatoolkit org 多路复用器子路由器 我有以下代码 router mux NewRouter StrictSlash true apiRouter router
  • 如何防止 Firefox 缓存

    我尝试了很多可能的解决方案 但无法解决问题 这些不起作用 有人可以帮忙吗 我正在使用jsp servlet application 是websphere Portal 6 1 的一个portlet 切勿
  • 使用:text/plain; 有什么缺点吗?字符集=“UTF-8”

    我的网络服务器提供的内容在 95 的情况下只是简单的 ascii 但在极少数情况下 内容包含一些德语非 ASCII 字符 现在我可以设置content type通过检测内容是否包含任何非 ASCII 字符来响应标头 或者我可以始终设置响应标
  • Crystal lang如何从http获取二进制文件

    In Ruby require open uri download open http example com download pdf IO copy stream download my file pdf 如何在水晶中做同样的事情 我们
  • 如何解决 302 重定向上的 POST 更改为 GET 的问题?

    我网站的某些部分只能通过 HTTPS 访问 不是整个网站 安全与性能妥协 并且如果通过纯 HTTP 发送请求 则 HTTPS 是通过对安全部分的请求进行 302 重定向来强制执行的 问题是对于所有主流浏览器来说 如果您在 POST 上执行
  • 如何通过在切片上查找来从切片复制到数组

    我正在编写一个库来处理二进制格式 我有一个带有数组变量的结构 我想保留它以用于文档目的 我还需要从输入字节片中查找和判断 一些伪代码 type foo struct boo 5 byte coo 3 byte func main input

随机推荐

  • 将类型参数约束为基类型

    我知道如何强制类型参数成为subtype另一种类型 public interface IMapping
  • Zend Zend_File_Transfer_Adapter_Http重命名问题

    我有一个关于在 Zend 中上传文件后重命名文件的问题 我不知道将重命名过滤器放在哪里 这就是我所拥有的 我尝试过移动东西 但我迷路了 目前 它确实将文件上传到我的照片文件夹 但没有重命名 谢谢你的帮助 if this gt request
  • iOS 上 UIVIew 和 CALayer 关于背景图片的关系

    试图理解UIView和CALayer之间的关系 我阅读了Apple文档 但它没有详细描述两者之间的关系 为什么当我添加背景图像来查看 自定义 ViewController view 时 我会得到不需要的图像黑色 当我将背景图像添加到 cus
  • TypeScript:抑制类型上不存在属性

    我在使用 TypeScript 时遇到了以下问题 有一个模块 它使用一个函数myApp common anotherFunc 来自 旧 js 代码 module myApp export module helpers export clas
  • AngularJS:隐藏 ng-message 直到点击表单提交按钮

    这是 AngularJS 1 x 中使用 ng messages 的典型示例
  • C#.NET - 如何让 typeof() 与继承一起使用?

    我将首先用代码解释我的场景 public class A public class B A public class C B public class D public class Test private A a new A privat
  • 在指令中使用 $compile 会触发 AngularJS 无限摘要错误

    关于为什么该指令会触发无限摘要错误有什么想法吗 http jsfiddle net smithkl42 cwrgLd0L 13 http jsfiddle net smithkl42 cwrgLd0L 13 var App angular
  • Compose Spacer 与视图填充性能

    我更喜欢使用 Spacer 在视图之间添加一些填充 有时您可以将此空间添加为视图的填充 所以我的问题是 使用 Spacers 与使用旧的填充值相比是否存在性能缺陷 性能会有所不同 在下面的测试中 50 个项目使用填充进行渲染 随后 50 个
  • 使用 XML 文件中的数据生成 Word 文档 (docx) / 基于模板将 XML 转换为 Word 文档

    我有一个 XML 文件 其中包含需要填充到 Word 文档中的数据 我需要找到一种方法来定义一个模板 该模板可以用作从 XML 文件填充数据并创建输出文档的基线 我相信有两种方法可以做到这一点 创建一个将作为 模板 的 XSLT 文件 并使
  • Oracle REGEXP_REPLACE 大写替换字符串

    我试图将我的 reg 表达式中的替换字符串大写 但没有成功 SELECT regexp replace src i uie v2 js uie v2 upper 1 from dual returns src i uie v2 js 我知道
  • CountDownLatch 的latch.await() 方法与Thread.join() 方法

    我看到一位 stackoverflow 成员建议使用 Thread join 让 主 线程等待 2 个 任务 线程完成 我经常会做一些不同的事情 如下所示 我想知道我的方法是否有任何问题 final CountDownLatch latch
  • 禁用 cookie 时会话还能工作吗?

    如果用户在浏览器中禁用了 cookie 会话还能工作吗 因为我知道当我创建会话时客户端中有一个会话 cookie 会话 ID 可以附加到 URL 所以 是的 他们可以 查看here http www webmasterworld com f
  • 在 OpenGL 中旋转三角形

    我正在尝试围绕其中心点旋转三角形 我知道 OpenGL 围绕原点旋转 因此我需要将中间点平移到原点 然后旋转 然后平移回来 我已经注释掉了最后一行 以确保它至少绕原点的中心旋转 它不是 尽管进行了翻译 但它似乎围绕其旧原点旋转 请注意 cc
  • Java ConcurrentHashMap 中增加分区数量的缺点?

    Java ConcurrentHashMap 在内部维护分区 每个分区可以单独加锁 在某些情况下 多个线程访问的所有键都落入同一分区 而分区可能没有帮助 进一步增加分区数量应该会提高并发性 为什么 Java 为分区计数提供默认值 16 而不
  • 如何检查是否支持naturalWidth?

    我有以下 jQuery 并想测试是否支持naturalWidth function special image if typeof this naturalWidth undefined do something 但这似乎不起作用 有任何想
  • 以日期时间字符串作为 x 值的等值线图

    我正在尝试生成一个颜色等值线图 其中 x 轴显示时间 y 轴深度 z 值显示温度 时间给出如下 2011 01 01 00 01 i e Y m d H M 有没有一种方法可以从中生成颜色等高线图 并使用 filled contour Ti
  • 更新已安装包中的数据集

    是否可以更新本地已安装软件包中的数据集 我维护的包有一个基于定期更新数据的数据集 我想更新数据集的本地版本并将更改保存回包中 以便下次加载数据时 即data xxx 将加载数据集的更新版本 从中长期来看 我将更新软件包 然后将新版本上传到
  • 如何返回带有错误消息或异常的 NotFound() IHttpActionResult?

    我正在返回 NotFoundIHttpActionResult 当我的 WebApi GET 操作中找不到某些内容时 除了此响应之外 我还想发送自定义消息和 或异常消息 如果有 目前的ApiController s NotFound 方法不
  • Python浮点舍入错误[重复]

    这个问题在这里已经有答案了 使用列表理解表达式时 x 0 1 for x in range 0 5 我希望得到这样的列表 0 0 0 1 0 2 0 3 0 4 然而我却得到了这个 0 0 0 1 0 2 0 300000000000000
  • 如何接收流式传输的 HTTP 响应

    当使用 Go 抛出 HTTP 请求并接收响应时 考虑到 ResponseBody 很大 1 GB 或更多 的情况 我希望在流式传输时接收响应 resp err http Client Do req 在这种情况下 如果正文很大 我无法读取标题