В образце демонстрационного приложения я использую React Native для совершения сетевых вызовов. Под капотом React Native использует NSURLSession
с NSURLRequestUseProtocolCachePolicy
в качестве политики кэширования по умолчанию. Когда сеть сделан вызов, ответ, возвращаемый службой содержит следующие элементы управления кэш-заголовки:Использование must-revalidate с NSURLSession через React Native
public, max-age=10, must-revalidate
Что я могу заметить, что NSURLSession
не чтить 10
секунд, если max-revalidate
присутствует. Напротив, если последнее не присутствует, когда новый сетевой вызов выполняется в пределах 10
секунд, возвращается ответ кэша, в противном случае выполняется новый вызов.
На основании раздела 14.9.4 Cache Revalidation and Reload Controls это не должно быть ожидаемое поведение, но, возможно, я ошибаюсь.
Поскольку кэш может быть сконфигурирован, чтобы игнорировать время истечения срока с сервером указан , и потому, что запрос клиента может включать в себя подразумевают наиболее несвежий директивы (который имеет такой же эффект), протокол также включает в себя механизма исходный сервер требует повторной проверки кэша записи при любом последующем использовании. Когда директива must-revalidate имеет значение , присутствующую в ответе, полученном кешем, этот кеш НЕ ДОЛЖЕН использовать запись после того, как она станет устаревшей, чтобы ответить на последующий запрос без предварительной проверки его с исходным сервером. (Т.е., кэш ДОЛЖЕН сделать из конца в конец Ревалидации каждый раз, если, основываясь исключительно на сервере происхождений истекает или значение максимального возраста, в кэше ответ несвежих.)
Я нашел полезное обсуждение на эту тему: HTTP Cache Control max-age, must-revalidate. На основе обсуждения, кажется, что протокол является немного
неоднозначного здесь, но на практике я обнаружил, что нужно обязательно перепроверять означает, что он должен перепроверить независимо от максимального возраста.
Очень странная вещь, что если я сделать то же самое с Android, используя как max-age
и must-revalidate
поведение является правильным. После 10
секунд будет сделан новый запрос. В течение 10
секунд запрос не запрашивается.
Любой ключ?