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

时间:2015-07-22 16:45:31

标签: javascript http xmlhttprequest transfer-encoding

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

  

HTTP 1.1 POST ... / v1 / processAudio

     

Transfer-Encoding:chunked

     

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

     

[Chunk 2 256 Bytes]

     

[Chunk 3 256 Bytes]

     

...

音频文件通常很短,大小约为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>
&#13;
&#13;
&#13;

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

拒绝设置不安全的标题&#34;转移编码&#34;

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

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

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

任何想法或建议都会非常有用。

1 个答案:

答案 0 :(得分:1)

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

对于完整的标头集,请参阅W3C XMLHttpRequest Level 1中的4.6.2 The setRequestHeader() method,并注意Transfer-Encoding是用户代理控制的标头之一,以便让它控制传输的这些方面。

  • 接收字符集
  • 接受编码
  • 访问控制请求报头
  • 访问控制请求-方法
  • 连接
  • 的Content-Length
  • 曲奇
  • COOKIE2
  • 日期
  • DNT
  • 期望
  • 主机
  • 保持活动
  • 来源
  • Referer的
  • TE
  • 拖车
  • 传送编码
  • 升级
  • 的User-Agent

WhatWG Fetch API生活标准中有类似的列表。 https://fetch.spec.whatwg.org/#terminology-headers