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