2015-07-22 12 views
8

Tôi có API REST chấp nhận tệp Âm thanh qua Bài đăng HTTP. API có hỗ trợ cho Chuyển mã hóa: tiêu đề yêu cầu chunked để tệp có thể được tải lên thành từng mảnh khi nó được tạo từ một máy ghi đang chạy trên máy khách. Bằng cách này, máy chủ có thể bắt đầu xử lý tệp khi nó đến để cải thiện hiệu suất. Ví dụ:BÀI ĐĂNG HTTP bằng cách sử dụng XHR với Mã hóa Chuyển Chunked

HTTP 1.1 POST .../v1/processAudio

Transfer-Encoding: chunked

[Chunk 1 256 Bytes] (server bắt đầu chế biến khi đến)

[ chunk 2 256 Bytes]

[đoạn 3 256 Bytes]

...

Tệp âm thanh thường ngắn và có kích thước khoảng 10K đến 100K. Tôi có mã C# và Java đang hoạt động nên tôi biết rằng API hoạt động. Tuy nhiên, tôi dường như không thể nhận bản ghi và tải lên hoạt động trong trình duyệt bằng javascript.

Đây là Mã thử nghiệm của tôi mà không một POST để localhost với 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>

Vấn đề là tôi nhận được lỗi sau trong Chrome

Bị từ chối đặt tiêu đề không an toàn "Chuyển mã hóa"

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

Sau khi xem tài liệu XHR tôi vẫn còn bối rối vì nó không nói về tiêu đề yêu cầu không an toàn. Tôi tự hỏi nếu có thể XHR không cho phép hoặc triển khai Chuyển mã hóa: chunked cho HTTP POST?

Tôi đã xem xét việc sử dụng nhiều yêu cầu XHR.send() và WebSockets nhưng cả hai đều không mong muốn vì nó sẽ yêu cầu thay đổi đáng kể đối với API máy chủ đã sẵn sàng, đơn giản, ổn định và hoạt động. Vấn đề duy nhất là chúng ta dường như không thể POST từ một trình duyệt với tính năng psedo-streaming thông qua Transfer-Encoding: chunked request header.

Bất kỳ suy nghĩ hoặc lời khuyên nào sẽ rất hữu ích.

+0

Bạn không được phép để thiết lập tiêu đề đó. Nó được kiểm soát bởi tác nhân người dùng. Kiểm tra spec w3 cho nó ở đây: http://www.w3.org/TR/XMLHttpRequest/#the-setrequestheader-method, đặc biệt là nơi nó nói: "Các tiêu đề trên được điều khiển bởi các tác nhân người dùng để cho nó kiểm soát các khía cạnh giao thông vận tải ". –

Trả lời

0

Như đã đề cập trong nhận xét, bạn không được phép đặt tiêu đề đó vì nó được kiểm soát bởi tác nhân người dùng.

Để có bộ tiêu đề đầy đủ, hãy xem 4.6.2 The setRequestHeader() method từ W3C XMLHttpRequest Cấp 1 và lưu ý rằng Transfer-Encoding là một trong các tiêu đề được kiểm soát bởi tác nhân người dùng để cho phép nó kiểm soát các khía cạnh đó.

  • Accept-Charset
  • Accept-Encoding
  • Access-Control-Yêu cầu-Headers
  • Access-Control-Yêu cầu-Phương pháp
  • kết nối
  • Content-Length
  • Cookie
  • Cookie2
  • ngày
  • DNT
  • Expect
  • chủ
  • Keep-Alive
  • xứ
  • Referer
  • TE
  • Trailer
  • Transfer-Encoding
  • Upgrade
  • User-Agent
  • Via

Có một danh sách tương tự trong WHATWG Fetch API Living Standard. https://fetch.spec.whatwg.org/#terminology-headers

Các vấn đề liên quan