2009-09-16 41 views
15

Câu hỏi cốt lõi là về việc sử dụng Tiêu đề HTTP, bao gồm Range, If-Range, Accept-Ranges và trình xác định phạm vi do người dùng xác định.Sử dụng Tiêu đề phạm vi HTTP với trình chỉ định phạm vi khác với byte?

Đây là ví dụ được sản xuất để giúp minh họa câu hỏi của tôi. Giả sử tôi có một ứng dụng phong cách Web 2.0 hiển thị một số loại tài liệu có thể đọc được của con người. Các tài liệu này được chia nhỏ thành các trang (tương tự như các bài viết bạn thấy trên các trang web tin tức). Đối với ví dụ này, giả sử:

  • Có một tài liệu có tiêu đề "Câu hỏi phạm vi HTTP" được chia thành ba trang.
  • Trang trình bao (/document/shell/http-range-question) biết thông tin meta về tài liệu, bao gồm số trang.
  • Trang có thể đọc được đầu tiên của tài liệu được tải trong sự kiện tải trang qua ajax GET và được chèn vào trang.
  • Điều khiển giao diện người dùng trông giống như [1 2 3 Tất cả] nằm ở cuối trang và nhấp vào một số sẽ hiển thị trang có thể đọc được (cũng được tải qua ajax) và nhấp vào "Tất cả" sẽ hiển thị toàn bộ tài liệu. Giả sử các URL cho 1, 2, 3 và Tất cả các trường hợp sử dụng:
    • /document/content/http-range-question?page=1
    • /document/content/http-range-question?page=2
    • /document/content/http-range-question?page=3
    • /document/content/http-range-question

Bây giờ đến câu hỏi. Tôi có thể sử dụng tiêu đề Phạm vi HTTP thay cho một phần của URL (ví dụ: tham số chuỗi truy vấn) không? Có lẽ một cái gì đó như thế này theo yêu cầu GET /document/content/http-range-question:

Range: page=1 

Dường như spec chỉ xác định byte dao động như cho phép, vì vậy ngay cả nếu tôi thực hiện cuộc gọi ajax của tôi làm việc với trình duyệt của tôi và mã máy chủ, bất cứ điều gì ở giữa có thể phá vỡ hợp đồng (ví dụ: máy chủ proxy caching).

Range: bytes=0-499 

Bất kỳ ý kiến ​​hoặc ví dụ thực tế nào về số liệu tùy chỉnh phạm vi tùy chỉnh?

Cập nhật: Tôi đã tìm thấy một câu hỏi tương tự về header Range (Paging in a Rest Collection), nơi họ đề cập rằng Dojo của JsonRestStore sử dụng một giá trị tiêu đề Phạm vi tùy chỉnh.

Range: items=0-24 
+0

bản sao có thể có của [Phân trang trong bộ sưu tập còn lại] (http://stackoverflow.com/questions/924472/paging-in-a-rest-collection) – DanMan

+0

@DanMan - Tôi đã liên kết với câu hỏi tương tự đó, nhưng không phải tất cả HTTP đều là REST và câu hỏi này hỏi một câu hỏi về các giá trị cho phép, không phải là ngữ nghĩa REST. Ngoài ra, từ ngữ tiêu đề câu hỏi khác nhau giúp những người khác nhau tìm thấy câu trả lời của họ. –

Trả lời

32

Tuyệt đối - bạn được tự do chỉ định bất kỳ đơn vị phạm vi nào bạn muốn.

Từ RFC 2616:

3,12 Phạm vi Đơn vị

HTTP/1.1 cho phép một khách hàng để yêu cầu đó chỉ là một phần (một loạt các) cơ quan
đáp ứng được bao gồm trong các phản ứng . HTTP/1.1 sử dụng đơn vị dải ô trong phạm vi Phạm vi (phần 14.35) và Phạm vi nội dung (phần 14.16)
trường tiêu đề. Một thực thể có thể bị phá vỡ xuống các vị trí phụ theo các đơn vị cấu trúc khác nhau.

range-unit  = bytes-unit | other-range-unit 
    bytes-unit  = "bytes" 
    other-range-unit = token 

Đơn vị phạm vi duy nhất được xác định bởi HTTP/1.1 là "byte". HTTP/1.1
triển khai CÓ THỂ bỏ qua phạm vi được chỉ định bằng các đơn vị khác.

Đoạn quan trọng là đoạn cuối cùng. Thực sự những gì nó nói là khi họ viết thông số cho HTTP/1.1, họ chỉ phác thảo mã thông báo "byte". Tuy nhiên, như bạn có thể thấy từ bit 'khác-range-unit', bạn có thể tự do tìm ra các specifier token của riêng mình.

Sắp ra với các chỉ số Phạm vi của riêng bạn có nghĩa là bạn phải có quyền kiểm soát mã máy khách và máy chủ sử dụng công cụ xác định đó. Vì vậy, nếu bạn sở hữu phần phụ trợ cho thấy URI "/ tài liệu/nội dung/http-phạm vi câu hỏi", bạn tốt để đi; có lẽ bạn đang sử dụng một khung công tác web hiện đại cho phép bạn kiểm tra các tiêu đề yêu cầu. Bạn có thể xem các giá trị Phạm vi để thực hiện truy vấn sao lưu một cách chính xác.

Hơn nữa, nếu bạn kiểm soát mã AJAX tạo yêu cầu cho chương trình phụ trợ, bạn sẽ có thể tự đặt tiêu đề Phạm vi.

Tuy nhiên, có một nhược điểm tiềm ẩn mà bạn dự đoán trong câu hỏi của mình: khả năng phá vỡ bộ nhớ đệm. Nếu bạn đang sử dụng đơn vị Phạm vi tùy chỉnh, mọi bộ đệm giữa máy khách của bạn và máy chủ gốc "CÓ THỂ bỏ qua các phạm vi được chỉ định bằng [đơn vị không phải là 'byte']". Vì vậy, ví dụ, nếu bạn đã có một bộ nhớ đệm Squid/Varnish giữa phía trước và phụ trợ, không có đảm bảo rằng các kết quả mà bạn đang hy vọng sẽ được phục vụ từ bộ nhớ cache!

Bạn cũng có thể xem xét triển khai thay thế, thay vì sử dụng chuỗi truy vấn, bạn đặt trang thành "tham số" của URI; ví dụ:/tài liệu/nội dung/http-range-question/page/1. Điều này có thể sẽ là một công việc ít hơn cho bạn phía máy chủ, nhưng nó tuân thủ HTTP/1.1 và cache nên xử lý nó đúng cách.

Hy vọng điều này sẽ hữu ích.

+0

Điểm tốt về bộ nhớ đệm, nhưng đó là những gì tiêu đề "khác nhau" dành cho. http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.44 Vấn đề lớn hơn là nó không phải là rất HATEOAS. –

-2

Có vẻ như bạn muốn thay đổi thông số HTTP chỉ để xóa tham số chuỗi truy vấn. Để thực hiện điều này, bạn phải sửa đổi mã trên cả máy khách để gửi tiêu đề đã sửa đổi và máy chủ để đọc từ tiêu đề "Phạm vi" thay vì chuỗi truy vấn.

Kết quả cuối cùng là điều này có thể sẽ hiệu quả, nhưng bạn đang phá vỡ tất cả các tiêu chuẩn và công cụ hiện có để thực hiện việc này.

+4

Tôi thấy nó càng cố gắng tuân thủ tinh thần của thông số trong một URL có thể lấy toàn bộ nội dung hoặc sử dụng tiêu đề được xác định trong thông số, có thể nhận được phần logic của nội dung (nhưng không được phân đoạn theo byte). Tuy nhiên, hoàn toàn có thể đây là một ý tưởng tồi ngay cả khi tôi có thể làm cho nó hoạt động. –

+3

Tôi đồng ý với Kevin và tôi nghĩ rằng đặc điểm kỹ thuật khá rõ ràng rằng điều này là có thể (tại sao khác nên có trường Accept-Ranges trong một phản hồi xác định đơn vị phạm vi được máy chủ chấp nhận). Ngoài ra, khi trả lại, ví dụ: một bộ sưu tập mảng JSON đáp ứng Phạm vi nội dung có thể cung cấp kích thước của tất cả các mục, ví dụ: Phạm vi nội dung: các mục 0-9/20 trong khi giải pháp chuỗi truy vấn phải bằng cách nào đó chuyển thông tin đó ở nơi khác. – Daff

0

Phạm vi HTTP thường được sử dụng để khôi phục các lần tải xuống bị gián đoạn mà không bắt đầu từ đầu.

Những gì bạn đang cố gắng thực hiện sẽ được xử lý tốt hơn bởi OAI-ORE, cho phép bạn xác định mối quan hệ giữa nhiều tài liệu. (các định dạng thay thế, thành phần của toàn bộ, vv)

Thật không may, đó là định dạng siêu dữ liệu tương đối mới và tôi không biết bất kỳ trình duyệt web nào có hỗ trợ gốc.

0

byte là đơn vị duy nhất được hỗ trợ bởi Đặc tả HTTP 1.1.

+2

Có, nhưng đơn vị dải mới là điểm mở rộng –

+0

Đơn vị dải ô mới phải được đăng ký trong "Đơn vị đăng ký đơn vị phạm vi" như được đề cập trong https://tools.ietf.org/html/rfc7233#section-2.2 Không có đăng ký chính thức bất kỳ đơn vị nào khác thì đơn vị byte hoặc "none" không hợp lệ. –

+0

Từ 7233: "Đơn vị dải ô mới * phải * được đăng ký với IANA." (tôi nhấn mạnh). "Ought" không được xác định trong . Đây có phải là một yêu cầu, ngay cả một yêu cầu mềm, họ sẽ không chỉ ra như vậy với một trong các thuật ngữ "PHẢI", "YÊU CẦU", "S SHN", "NÊN", hoặc "ĐỀ XUẤT"? –

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