问题标签 [http-chunked]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
325 浏览

swift - 分块请求中未调用 URLSession didReceiveData

我尝试从dweet.io服务收听数据。我使用listen方法实时获取数据。它使用分块的 HTTP 响应

我为此创建了简单的网络管理器

当我启动它时,我永远不会得到数据。但是,我收到了 200 个状态代码和标题的响应。大约一分钟后,我得到一个错误The network connection was lost.

同时我curl用于同样的事情。它正在按预期获取数据。

我感到困惑的另一件事是 iOS 应用程序和 curlTransfer-Encoding在标题中的字段中向我显示了不同的值:

UrlSession返回 "Transfer-Encoding" : "Identity"

同时 curl 显示Transfer-Encoding: chunked(这是预期的)。

我尝试应用此答案中描述的方法,但得到了相同的结果。

0 投票
1 回答
405 浏览

javascript - Fetch 的 Response.body 块是否对应 HTTP 块?

我正在做一个 Fetch-api 请求,服务器使用 HTTP 分块传输编码(带有文本数据)进行回复。我正在使用Response.body作为流的数据。

我想知道:假设流生成的块对应于 HTTP 块是否安全?我已经看到一些问题[1-3] 似乎做出了这种假设,但我在规范中找不到任何关于此的内容。

[1] JS Fetch 使用分块传输编码(将 curl 转换为 Fetch)
[2]在 javascript 中异步使用分块数据
[3]使用 Fetch API 读取分块二进制响应

0 投票
0 回答
520 浏览

c# - C# 按块检索 HTTP POST 分块响应?

我正在使用一个接受 HTTP POST 请求以及 URL 形式编码的查询数据作为有效负载的 API。来自服务器的响应是分块的,每个块包含一个 JSON 对象。我正在尝试通过 C# 中的块读取和解析服务器的响应,以便我可以获取块,使用 Newtonsoft 将其转换,然后执行我需要的任何处理。服务器每次查询返回一个未知的记录数 - 它可能是 0 条记录,也可能是数千个块。

我对典型解决方案的研究和测试HttpClient表明,这些库仅通过将所有内容连接到单个响应流中来“处理”块。此外,我读过其他帖子,表明如果服务器没有 100% 遵循规范,甚至有可能在流结束时出现异常。

我考虑了以下解决方案,但似乎没有一个是最佳的:

  1. 从 HTTP 响应中逐个字符、计数{}字符读取流,以查找 JSON 对象的开始和结束。每次}找到关闭时,解析对象。这是非常丑陋、低效且不通用的——它假设每个 JSON 响应都是一个对象,并且需要更改 wuold,例如,如果服务器发送一个 JSON 数组 ( [and ]),或者甚至每个块只发送一个 JSON 字符串。

  2. 完全跳过 HttpRequest/HttpClient 并在原始套接字中执行所有操作。然后,我可以解析块大小,从套接字流中准确读取那么多字节,并进行相应的解析。这会起作用,除了感觉像很多“重新发明轮子”,因为我必须为 POST 正文、标头解析、SSL/TLS 等实现 URL 编码。这一切基本上都被 HttpClient“解决”了,所以实现如果没有其他原因,我自己又觉得这是个坏主意,因为我可以很容易地引入一个解析错误。

  3. 由于服务器为每个块发送一个 JSON 对象,读取整个响应,然后查找}{并认为这些是 JSON 对象的分割点(因为在实际的 JSON 中,,两个对象之间会存在一个列表的一部分)。这充其量感觉是不可靠的——它假设每个块的 JSON 对象的两侧都没有空格。这也是低效的,因为如果服务器要返回数百万条记录,则需要将整个响应存储在 RAM 中。包含数百万条记录的响应的总大小可能超过 1GB,跨越数百个块。虽然这对于具有大量 RAM 的机器来说不一定是问题,但它是一种不必要的低效方法,用于解析设计为可流式传输的数据。

理想的场景是某种按块读取 HTTP 流的枚举器,因为 API 正在生成块,其中每个块恰好代表一个 JSON 对象。这是我考虑在选项 2 中实现的内容,但同样,这似乎需要大量重新发明轮子,并且可能会引入严重的错误。第二个最佳选择是在 HttpClient 执行请求并解析标头之后从 HttpClient获取原始的底层套接字流的方法——换句话说,一种获取包含块大小和分隔符的流的方法,所以然后我可以解析直接流式传输,提取块大小,并且基本上执行上面的#2,但无需编写我自己的 HTTP 实现。

实现此功能的最佳选择是什么?

0 投票
1 回答
6866 浏览

java - 如何使用 Spring Boot @RestController 流式传输分块响应

我在这上面花了一天的时间,但我找不到有效的解决方案。在我们的应用程序中,我们有几个可以返回大响应的端点。我一直在尝试找到一种机制,允许我们在处理数据库查询结果时流式传输响应。主要目标是限制服务端的峰值内存使用量(不需要内存中的整个响应)并最小化响应第一个字节的时间(如果响应没有开始在指定时间 - 10 分钟)。我真的很惊讶这这么难。

我找到了 StreamingResponseBody,它似乎与我们想要的很接近,虽然我们并不真正需要异步方面,但我们只希望能够在处理查询结果时开始流式传输响应。我也尝试过其他方法,比如使用@ResponseBody 进行注释、返回void 以及添加OutputStream 的参数,但这不起作用,因为传递的OutputStream 基本上只是一个缓存整个结果的CachingOutputStream。这是我现在所拥有的...

资源方式:

异步配置:

我期望客户端会在调用 StreamingResponseBody.writeTo() 后立即开始看到响应,并且响应标头将包括

但不是

相反,在 StreamingResponseBody.writeTo() 返回并且响应包含 Content-Length 之前,我在客户端看不到任何响应。(但不是内容编码)

我的问题是,当我在 writeTo() 中写入 OutputStream 并且不缓存整个有效负载并仅在最后发送时,告诉 Spring 发送分块响应的秘诀是什么?具有讽刺意味的是,我发现想知道如何禁用分块编码的帖子,但没有启用它。

0 投票
1 回答
1309 浏览

django - http流实际上是由http chunk实现的吗?

一开始我以为http流其实就是实现了http chunk。

所以我做了一个测试来学习。

这是一个django视图

func return iterable 这是使用 curl 访问视图的输出

从输出中您可以看到没有分块标题。似乎Http流与块无关。

所以这是问题

  • http流是由http chunk实现的吗?
  • 如何在 django 中返回分块响应?
0 投票
1 回答
61 浏览

http - 分块传输编码不适用于除 Firefox 之外的任何浏览器

我正在使用我的 HTTP 服务器,如果请求的文件大于 64K,我将分块传输编码应用于我的响应。它适用于 Firefox,我什至可以发送大型视频,但 Chrome 和 Curl 只是关闭连接并且不显示任何内容。

如果我写我对文件的响应,结果是这样的:

HTTP/1.1 200 OK
传输编码:分块

0x3ff\r\n
大量文本\r\n
0x41\r\n
较少文本\r\n
0\r\n
\r\n

在哪里寻找问题?我应该添加内容类型标题吗?为什么它适用于 Firefox 而不适用于其他浏览器/实用程序?先感谢您。

0 投票
1 回答
128 浏览

jmeter - 如何在 jmeter 上读取分块的 HTTP 响应?

我正在使用 jmeter 发送 HTTP POST 请求。服务器以分块的 http 响应 200 ok 响应,我需要解析初始块。但是 jmeter 等待所有响应块。我尝试使用 http 采样器和 http 原始请求采样器。在这两种情况下,块都不会单独解析。

0 投票
0 回答
61 浏览

http - 分块传输编码、内容长度和字节服务

https://gist.github.com/CMCDragonkai/6bfade6431e9ffb7fe88中,它说

请注意,字节服务与分块编码兼容,这适用于您知道总内容长度,希望允许部分或可恢复下载,但您希望将每个部分响应流式传输到客户端的情况。

我认为如果您想允许部分和可恢复的下载,您需要使用Content-Length分块编码不允许的 HTTP 标头。我的理解不正确吗?

0 投票
1 回答
51 浏览

grpc - 块传输与 grpc 流式传输

我正在做一个项目,我想在其中公开一个 API,该 API 将读取一个大文件并发送该文件作为响应。

由于文件可以很大,最好以块的形式发送文件,这样对系统的内存压力不会太大。

我评估了 2 个选项:HTTP-1.1 支持的分块传输(https://en.m.wikipedia.org/wiki/Chunked_transfer_encoding)和 grpc 的服务器端流。

在 grpc 方法中,客户端通过 rpc 请求,而服务器将通过 grpc 通道流式传输字节,并在完成后关闭相同的。

我的生态系统可以同时支持,客户端也支持 grpc。

您能否建议哪种选择更好,两种方法的优缺点是什么。