使用XHR和分块传输编码的HTTP POST

Mik*_*ick 12 javascript http xmlhttprequest transfer-encoding

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

HTTP 1.1 POST .../v1/processAudio

转移编码:分块

[Chunk 1 256 Bytes](服务器到达时开始处理)

[块2 256字节]

[块3 256字节]

...

音频文件通常较短,大小约为10K到100K.我有C#和Java代码正在工作,所以我知道API工作.但是,我似乎无法使用javascript在浏览器中进行录制和上传工作.

这是我的测试代码,使用Transfer-Encoding对localhost执行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>
Run Code Online (Sandbox Code Playgroud)

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

拒绝设置不安全的标题"Transfer-Encoding"

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

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

我已经看过使用多个XHR.send()请求和WebSockets的工作,但两者都是不受欢迎的,因为它需要对已经存在的服务器API进行重大更改,简单,稳定和有效.唯一的问题是我们似乎无法通过Transfer-Encoding从具有psedo-streaming的浏览器POST:chunked request header.

任何想法或建议都会非常有帮助.

Kev*_*son 3

正如评论中提到的,您不允许设置该标头,因为它是由用户代理控制的。

有关完整的标头集,请参阅W3C XMLHttpRequest Level 1 中的4.6.2 setRequestHeader() 方法Transfer-Encoding,并注意这是由用户代理控制的标头之一,以使其控制传输的这些方面。

  • 接受字符集
  • 接受编码
  • 访问控制请求标头
  • 访问控制请求方法
  • 联系
  • 内容长度
  • 曲奇饼
  • 饼干2
  • 日期
  • 二硝基甲苯
  • 预计
  • 主持人
  • 活着
  • 起源
  • 推荐人
  • TE
  • 预告片
  • 传输编码
  • 升级
  • 用户代理
  • 通过

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