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
kê
- 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à Akj5odjr
và f.jpg;F498wdn4
là một mục mới. Bởi các yêu cầu trong tương lai được giảm:
kê
- 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.
"Nhiều tài nguyên" trong API của bạn là gì? –
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. –
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