gpt4 book ai didi

javascript - 使用带分块传输编码的 XHR 的 HTTP POST

转载 作者:可可西里 更新时间:2023-11-01 02:12:35 62 4
gpt4 key购买 nike

我有一个 REST API,它通过 HTTP Post 接受音频文件。 API 支持 Transfer-Encoding: chunked 请求 header ,以便文件可以在从客户端上运行的记录器创建时分段上传。这样服务器可以在文件到达时开始处理文件以提高性能。例如:

HTTP 1.1 POST .../v1/processAudio

Transfer-Encoding: chunked

[Chunk 1 256 Bytes] (server starts processing when arrives)

[Chunk 2 256 Bytes]

[Chunk 3 256 Bytes]

...

音频文件通常很短,大小在 10K 到 100K 左右。我有正在运行的 C# 和 Java 代码,所以我知道 API 可以运行。但是,我似乎无法使用 javascript 在浏览器中进行录制和上传。

这是我的测试代码,它使用传输编码向本地主机执行 POST:

<html>
<script type="text/javascript">
function streamUpload() {
var blob = new Blob(['GmnQPBU+nyRGER4JPAW4DjDQC19D']);
var xhr = new XMLHttpRequest();
// Add any event handlers here...
xhr.open('POST', '/', true);
xhr.setRequestHeader("Transfer-Encoding", "chunked");
xhr.send(blob);
}
</script>

<body>
<div id='demo'>Test Chunked Upload using XHR</div>
<button onclick="streamUpload()">Start Upload</button>
</body>

</html>

问题是我在 Chrome 中收到以下错误

拒绝设置不安全的 header “Transfer-Encoding”

streamUpload @ uploadTest.html:14onclick @uploadTest.html:24

在查看 XHR 文档后,我仍然感到困惑,因为它没有讨论不安全的请求 header 。我想知道 XHR 是否可能不允许或实现 HTTP POST 的 Transfer-Encoding: chunked

我已经研究过使用多个 XHR.send() 请求和 WebSockets 的变通方法,但两者都是不可取的,因为它需要对服务器 API 进行重大更改,而这些 API 已经存在、简单、稳定且可以正常工作。唯一的问题是我们似乎无法通过 Transfer-Encoding: chunked 请求 header 从具有伪流的浏览器进行 POST。

任何想法或建议都会很有帮助。

最佳答案

如评论中所述,您不能设置该 header ,因为它由用户代理控制。

有关完整的 header 集,请参阅 4.6.2 The setRequestHeader() method来自 W3C XMLHttpRequest Level 1 并注意 Transfer-Encoding 是由用户代理控制的 header 之一,以让它控制传输的这些方面。

  • 接受字符集
  • 接受编码
  • 访问控制请求 header
  • 访问控制请求方法
  • 连接
  • 内容长度
  • cookies
  • cookies 2
  • 日期
  • 拒绝
  • 期待
  • 主持人
  • 保持活跃
  • 产地
  • 推荐人
  • TE
  • 预告片
  • 传输编码
  • 升级
  • 用户代理
  • 通过

WhatWG Fetch API Living Standard 中有一个类似的列表。 https://fetch.spec.whatwg.org/#terminology-headers

关于javascript - 使用带分块传输编码的 XHR 的 HTTP POST,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31569223/

62 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com