2015-07-22 3 views
8

У меня есть REST API, который принимает аудиофайл через HTTP-сообщение. API поддерживает передачу-кодирование: chunked request header, чтобы файл можно было загружать на куски, поскольку он создается из рекордера, работающего на клиенте. Таким образом, сервер может начать обработку файла по мере его поступления для повышения производительности. Например:HTTP POST с использованием XHR с кодировкой с кодировкой передачи

HTTP POST 1.1 .../v1/processAudio

Transfer-Encoding: фрагментированное

[Chunk 1 256 байт] (сервер начинает обработку при поступлении)

[ Chunk 2 256 байт]

[Chunk 3 256 байт]

...

Аудио файлы обычно короткие и имеют размер от 10 до 100 КБ. У меня есть C# и Java-код, который работает, поэтому я знаю, что API работает. Тем не менее, я не могу заставить записывать и загружать работу в браузере с помощью javascript.

Вот мой тест код, который делает POST на локальный с Transfer-Encoding:

<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

Отказано для установки небезопасного заголовка «Transfer-Encoding»

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

После просмотра документации XHR я все еще запутался, потому что не говорит о небезопасных заголовках запросов. Мне интересно, возможно ли, что XHR не разрешает или не реализует Transfer-Encoding: chunked для HTTP POST?

Я рассмотрел работу с использованием нескольких запросов XHR.send() и WebSockets, но оба они нежелательны, поскольку для этого потребуются значительные изменения в API-интерфейсах серверов, которые уже существуют, просты, стабильны и работают. Единственная проблема заключается в том, что мы не можем казаться POST из браузера с psedo-streaming через Transfer-Encoding: chunked request header.

Любые мысли или советы были бы очень полезными.

+0

Вы не можете установить этот заголовок. Он управляется пользовательским агентом. Проверьте здесь спецификацию w3: http://www.w3.org/TR/XMLHttpRequest/#the-setrequestheader-method, в частности, где говорится: «Указанные выше заголовки контролируются пользовательским агентом, чтобы он контролировал эти аспекты транспорта ". –

ответ

0

Как уже упоминалось в комментарии, вам не разрешено устанавливать этот заголовок, поскольку он контролируется пользовательским агентом.

Полный набор заголовков см. В разделе 4.6.2 The setRequestHeader() method с W3C XMLHttpRequest Level 1 и обратите внимание, что Transfer-Encoding является одним из заголовков, которые контролируются пользовательским агентом, чтобы он контролировал эти аспекты транспорта.

  • Accept-Charset
  • Accept-Encoding
  • Access-Control-Request-Headers
  • Access-Control-Request-Method
  • соединения
  • Content-Length
  • Cookie
  • Cookie2
  • Дата
  • DNT
  • Ожидать
  • Хост
  • Keep-Alive
  • Происхождение
  • Referer
  • TE
  • Прицеп
  • Transfer-Encoding
  • Upgrade
  • User-Agent
  • Via

Существует аналогичный список в WHATWG Fetch API Living Standard. https://fetch.spec.whatwg.org/#terminology-headers

Смежные вопросы