2015-02-14 24 views
5

Nhiều API REST cung cấp khả năng tìm kiếm tài nguyên.Thẻ và bộ sưu tập

Ví dụ, tài nguyên của loại A có thể được lấy bằng cách sử dụng yêu cầu HTTP sau:

GET /A?prop1={value1}&prop2={value2} 

Tôi đang sử dụng khóa lạc quan và do đó muốn quay trở lại phiên bản dành cho tất cả các tài nguyên trở lại của kiểu A. Cho đến bây giờ, tôi đã sử dụng tiêu đề ETag khi chỉ tìm nạp một tài nguyên bằng cách sử dụng ID của nó.

Có cách HTTP để trả lại phiên bản cho nhiều tài nguyên trong cùng một phản hồi không? Nếu không, tôi có nên bao gồm các phiên bản trong cơ thể không?

Cảm ơn, Mickael


EDIT: tôi tìm thấy trên web mà các ETag thường được tạo ra bằng cách tính toán một hash của một phần của câu trả lời. Cách tiếp cận này phù hợp với trường hợp của tôi kể từ khi một băm của bộ sưu tập trả về sẽ được tính toán. Tuy nhiên, nếu khách hàng quyết định cập nhật một trong các yếu tố trong bộ sưu tập, bạn nên đặt ETag vào tiêu đề If-Match? Tôi nghĩ rằng trong đó có ETags trong những yếu tố cá nhân là giải pháp duy nhất ...

+0

"Nhiều tài nguyên" trong API của bạn là gì? –

+0

Một tập hợp các nguồn tài nguyên loại A. Tuy nhiên, bộ sưu tập này không phải là một nguồn tài nguyên. Nó chứa các tài nguyên độc lập với nhau. Do đó, mỗi tài nguyên này đều có phiên bản riêng. –

+0

Nếu hiểu biết của tôi là chính xác, trong trường hợp có nhiều tài nguyên, phản hồi của bạn sẽ không có ETag, thay vào đó phiên bản của từng tài nguyên sẽ là một phần của nội dung phản hồi và yêu cầu HTTP PUT cho mỗi tài nguyên sẽ bao gồm thông tin phiên bản trong "if- đã sửa đổi từ "tiêu đề. đúng ? – refactor

Trả lời

1

tôi sẽ áp dụng một trong các tùy chọn này:

  1. Hãy ETags yếu theo mặc định và chúng được tạo ra với các nguồn tài nguyên trạng thái hiện tại, không phải với trình bày tài nguyên trong tải trọng phản hồi HTTP. Với điều đó, tôi có thể trả về một ETag hợp lệ cho mỗi tài nguyên trong phần phản hồi truy vấn thu thập, ngoài ETag cho toàn bộ tập hợp trong tiêu đề phản hồi.

  2. Bỏ qua If-Match và ETags cho trường hợp này và sử dụng If-Unmodified-Since với một tài sản là Last-Modified được cung cấp dưới dạng tài sản của từng tài nguyên. Bằng cách đó, tôi có thể bảo toàn các thẻ ET mạnh, nhưng khách hàng vẫn có thể cập nhật một mục dựa trên phản hồi bộ sưu tập mà không cần một yêu cầu khác tới chính tài nguyên đó.

  3. Cho phép cập nhật qua PATCH trên chính tài nguyên bộ sưu tập, sử dụng tiêu đề If-Match với ETag cho toàn bộ bộ sưu tập. Điều này có lẽ sẽ không hoạt động tốt nếu có nhiều thay đổi đồng thời, nhưng đó là một cách tiếp cận hợp lý.

2

Tôi nghĩ rằng nó phụ thuộc một chút vào số lượng tài nguyên, dữ liệu và yêu cầu giảm băng thông. Nhưng một giải pháp có thể là tách các tài nguyên trong các yêu cầu phụ.

Giả sử cuộc gọi nhóm GET /images?car=mustang&viewangle=front trả về 5 hình ảnh. Bây giờ bạn có thể bao gồm tất cả các hình ảnh dưới dạng dữ liệu nhị phân và GET-yêu cầu chính nó có một ETag độc đáo:

GET /images?car=mustang&viewangle=front 
... 
HTTP 1.1 200 OK 
ETag "aaaaaa" 

data:image/png;base64,a123456.... 
data:image/png;base64,b123456.... 
data:image/png;base64,c123456.... 
data:image/png;base64,d123456.... 
data:image/png;base64,e123456.... 

Vấn đề là bây giờ, rằng một bổ sung thay đổi hình ảnh ETag của cuộc gọi nhóm và bạn cần phải chuyển hoàn chỉnh đặt lại chỉ có một hình ảnh đã thay đổi:

GET /images?car=mustang&viewangle=front 
If-None-Match "aaaaaa" 
... 
HTTP 1.1 200 OK 
ETag "bbbbbb" 

data:image/png;base64,a123456.... 
data:image/png;base64,b123456.... 
data:image/png;base64,c123456.... 
data:image/png;base64,d123456.... 
data:image/png;base64,e123456.... 
data:image/png;base64,f123456.... 

Trong trường hợp này, giải pháp tốt nhất là bạn tách dữ liệu tài nguyên khỏi cuộc gọi nhóm.Vì vậy, câu trả lời chỉ bao gồm thông tin cho phụ yêu cầu:

GET /images?car=mustang&viewangle=front 
... 
HTTP 1.1 200 OK 
ETag "aaaaaa" 

a.jpg 
b.jpg 
c.jpg 
d.jpg 
e.jpg 

By rằng mỗi phụ yêu cầu có thể được lưu trữ separatly:

GET /image/?src=a.jpg 
If-None-Match "Akj5odjr" 
... 
HTTP 1.1 304 Not Modified 


- yêu cầu đầu tiên = 6x 200 OK
- Yêu cầu trong tương lai nếu nhóm không thay đổi = 1x 304 Not Modified
- Yêu cầu trong tương lai nếu một tài nguyên mới đã được thêm = 2x 200 OK , 5x 304 Not Modified

Bây giờ tôi sẽ điều chỉnh tài liệu API. Điều này có nghĩa là người yêu cầu phải kiểm tra xem bộ nhớ cache của yêu cầu phụ có sẵn trước khi thực hiện cuộc gọi đến nó hay không. Điều này có thể được thực hiện bằng cách cung cấp ETags (hoặc băm khác) trong yêu cầu nhóm:

GET /images?car=mustang&viewangle=front 
... 
HTTP 1.1 200 OK 
... 
ETag "aaaaaa" 

a.jpg;AfewrKJD 
b.jpg;Bgnweidk 
c.jpg;Ckirewof 
d.jpg;Dt34gsd0 
e.jpg;Egk29dds 
f.jpg;F498wdn4 

Bây giờ người yêu cầu kiểm tra bộ nhớ cache và phát hiện ra rằng có một a.jpg ETag mới gọi là Akj5odjrf.jpg;F498wdn4 là một mục mới. Bởi các yêu cầu trong tương lai được giảm:


- yêu cầu đầu tiên = 6x 200 OK
- yêu cầu trong tương lai nếu nhóm không thay đổi = 1x 304 Not Modified
- yêu cầu trong tương lai nếu một tài nguyên mới đã được thêm vào = 2x 200 OK

Kết luận
Cuối cùng, bạn cần phải suy nghĩ xem liệu tài nguyên của bạn có đủ lớn để đặt chúng trong yêu cầu phụ và tần suất một yêu cầu ester lặp lại yêu cầu nhóm bis (do đó cache được sử dụng). Nếu không, bạn nên đưa chúng vào cuộc gọi nhóm và bạn không có chỗ để tối ưu hóa.

P.S. bạn cần theo dõi tất cả những người yêu cầu để chắc chắn rằng tất cả họ đều sử dụng cache. Một giải pháp có thể là cấm người yêu cầu gọi URL API hai lần trở lên mà không cần gửi ETag.