请求不是从安卓应用发出的,但设置了最大年龄



我有一个 api 返回一个对象作为响应,一个 etag 和 max age 作为标头。响应如下所示:

头:

'x-frame-options': 'SAMEORIGIN',
'x-xss-protection': '1; mode=block',
'x-content-type-options': 'nosniff',
'x-download-options': 'noopen',
'strict-transport-security': 'max-age=15778476000; includeSubDomains',
'access-control-allow-origin': '*',
etag: 'c69148a0489a95058e729bde7fd4bf32bf2077b1cba8d4fcf0c2da6e696fa33e',
'cache-control': 'private,max-age=43200' 

身体:

{
id: 1985,
url: "https://example.com",
...
}

所需的场景是 android 应用程序发出请求以请求此数据。API 返回数据,最长期限为 43200 秒。

如果在 43200 秒之前发出请求,则应用程序将缓存上次响应中的数据。尽管如此,应用程序发出请求,后端服务编译响应数据,使用请求的 etag 来确定响应数据是否已更改。如果数据已更改,它将返回 200 http 状态和数据。否则,它将返回 403 状态且没有数据。

应用程序收到响应。它使用快速网络来处理缓存(我的安卓队友说(。如果返回 200 状态代码,则会更新数据。否则,应用程序将保留旧数据。

如果在 43200 秒后发出请求,则应用程序不再具有缓存的响应或其 etag。发出请求,即使数据中没有任何更改,数据也被视为"新",状态代码 200 与 max-age 标头一起返回,如上所述。

实际发生的情况:

出于某种原因,在处理第一个请求并且应用程序收到数据后,在 43200 秒过去之前不会发出任何请求。android 开发人员说他们看到发出了请求并返回了 0 字节,但是当我在服务器中监控请求时,我没有看到任何针对此 API 的请求。

这没有意义,因为 max-age 并不意味着没有发出任何请求。它只是指示应用程序在缓存中保留数据一段时间。

我是否错过了缓存、电子标签和最大年龄如何工作的想法?

后端内置在节点js中,并使用express进行路由。

您只在Cache-Control标头中设置了max-ageprivate指令。您描述的实际行为是正确的行为max-age因为指令与每次发出请求时强制缓存验证响应无关。为此,您还必须将no-cache指令添加到Cache-Control标头中。

no-cache指令告诉缓存在提供存储的响应之前始终使用源服务器验证存储的响应(即您描述的所需行为(。重新验证后,存储的响应将再有效 43200 秒 (max-age(。如果没有no-cache指令,HTTP 客户端可以自由使用缓存的响应。我想这就是为什么您的朋友说发出了请求,但返回了 0 个字节(浏览器也显示从缓存提供的响应为 0 字节(。这也是您没有观察到对服务器的任何传入请求的原因。

看看谷歌的这篇文章,了解HTTP缓存的良好概述: https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/http-caching

如果您需要有关如何从缓存构造响应的深入详细信息,请查看RFC7234规范:https://www.rfc-editor.org/rfc/rfc7234#section-4

相关内容

  • 没有找到相关文章

最新更新