Tôi đang gặp sự cố nhỏ với yêu cầu lưu bộ nhớ đệm bằng cách sử dụng kết nối không đồng bộ NSURLConnection trên iPhone. Tôi không biết nếu tôi hiểu một cái gì đó không đúng cách, hoặc nếu Cocoa đang làm điều ngược lại với những gì nó phải làm ...NSURLConnection, NSURLYêu cầu và bộ nhớ đệm từ xa
Các tài liệu cho NSURLRequest nói rằng:
NSURLRequestReloadIgnoringLocalCacheData
Chỉ định dữ liệu cho tải URL phải được tải từ nguồn gốc. Không có dữ liệu bộ nhớ cache hiện có nào được sử dụng để đáp ứng yêu cầu tải URL.
và:
NSURLRequestReloadIgnoringLocalAndRemoteCacheData
Chỉ định rằng không chỉ cần các dữ liệu bộ nhớ cache cục bộ được bỏ qua, nhưng điều đó proxy và trung gian khác cần được hướng dẫn để bỏ qua bộ nhớ đệm của họ cho đến nay là giao thức cho phép .
Bây giờ, nếu tôi gửi một NSURLRequest với NSURLRequestReloadIgnoringLocalCacheData (được cho là bỏ qua bộ nhớ cache của địa phương, nhưng sử dụng bộ nhớ cache từ xa nếu có), các tiêu đề được gửi là:
GET /dashboard HTTP/1.1 User-Agent: XBlip1.0 CFNetwork/422.15.2 Darwin/9.6.0 (i386) (iMac8%2C1) X-Blip-Api: 0.02 Accept: application/json Authorization: Basic (...) Accept-Language: en-us Accept-Encoding: gzip, deflate Connection: keep-alive Host: api.blip.pl
Và tình trạng này là 200 OK. Nhưng nếu tôi sử dụng NSURLRequestReloadIgnoringLocalAndRemoteCacheData, mà là vụ phải bỏ qua cache cả hai địa phương và từ xa, như tên cho thấy, một trong những tiêu đề bổ sung thêm:
If-None-Match: "d751713988987e9331980363e24189ce"
Và câu trả lời là 304 Not Modified. Tôi đã kiểm tra HTTP RFC và cho "If-None-Match", nó cho biết:
Nếu bất kỳ thẻ thực thể nào phù hợp với thẻ thực thể của đối tượng sẽ được trả về trong phản hồi yêu cầu GET tương tự (không có tiêu đề If-None-Match) trên tài nguyên đó, (...) thì máy chủ PHẢI KHÔNG thực hiện phương thức được yêu cầu (...) Thay vào đó, nếu phương thức yêu cầu là GET hoặc HEAD, máy chủ NÊN đáp ứng với một phản ứng (Không thay đổi) 304
Vì vậy, có vẻ như nếu tôi sử dụng NSURLRequestReloadIgnoringLocalAndRemoteCacheData, thay vì bỏ qua bộ nhớ cache từ xa, Cocoa nói với máy chủ từ xa một cách rõ ràng rằng nó nên sử dụng bộ nhớ đệm từ xa, và nếu tôi sử dụng NSURLRequestReloadIgnoringLocalCacheData, nó không thêm dòng đó và có hiệu lực bộ nhớ cache từ xa không được sử dụng.
Vậy chính xác những gì đang xảy ra ở đây? Tôi đã bỏ lỡ một cái gì đó, hoặc là Cocoa thiết lập một tiêu đề sai?