javascript - ejemplo - POST HTTP utilizando XHR con codificación de transferencia fragmentada
xmlhttprequest post json (1)
Tengo una API REST que acepta un archivo de audio a través de una publicación HTTP. La API tiene soporte para Transfer-Encoding: encabezado de solicitud fragmentada para que el archivo se pueda cargar en pedazos, ya que se está creando desde una grabadora ejecutándose en el cliente. De esta forma, el servidor puede comenzar a procesar el archivo a medida que llega para mejorar el rendimiento. Por ejemplo:
HTTP 1.1 POST ... / v1 / processAudio
Transferencia de codificación: fragmentada
[Chunk 1 256 Bytes] (el servidor comienza a procesar cuando llega)
[Chunk 2 256 Bytes]
[Chunk 3 256 Bytes]
...
Los archivos de audio suelen ser cortos y tienen un tamaño de entre 10.000 y 100 K. Tengo código C # y Java que funciona, así que sé que la API funciona. Sin embargo, parece que no puedo hacer que la grabación y la carga funcionen en un navegador usando javascript.
Aquí está mi código de prueba que hace una POST a localhost con transferencia de codificación:
<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>
El problema es que estoy recibiendo el siguiente error en Chrome
Se negó a configurar el encabezado inseguro "Transferir-Codificación"
streamUpload @ uploadTest.html: 14 onclick @ uploadTest.html: 24
Después de mirar la documentación de XHR todavía estoy confundido porque no habla de encabezados de solicitudes inseguras. Me pregunto si es posible que XHR no permita ni implemente Transfer-Encoding: fragmentado para HTTP POST.
He analizado la solución de problemas al utilizar múltiples solicitudes XHR.send () y WebSockets, pero ambas son indeseables porque requerirán cambios significativos en las API del servidor que ya están implementadas, son simples, estables y funcionan. El único problema es que no parece que POSTAR desde un navegador con psedo-streaming a través de Transferir-Codificación: encabezado de solicitud fragmentada.
Cualquier pensamiento o consejo sería muy útil.
Como se mencionó en un comentario, no está permitido configurar ese encabezado ya que está controlado por el agente de usuario.
Para ver el conjunto completo de encabezados, consulte 4.6.2 El método setRequestHeader () del W3C XMLHttpRequest Nivel 1 y tenga en cuenta que Transfer-Encoding
es uno de los encabezados controlados por el agente de usuario para permitirle controlar esos aspectos del transporte.
- Aceptar-Charset
- Aceptar-Codificar
- Access-Control-Request-Headers
- Access-Control-Request-Method
- Conexión
- Largancia de contenido
- Galleta
- Cookie2
- Fecha
- DNT
- Esperar
- Anfitrión
- Mantener viva
- Origen
- Referer
- TE
- Remolque
- Transferencia-Codificación
- Mejorar
- Agente de usuario
- Vía
Hay una lista similar en el estándar de vida de la API WhatWG Fetch. https://fetch.spec.whatwg.org/#terminology-headers