gpt4 book ai didi

android - 请求不是从 android 应用发出的,设置了 max-age

转载 作者:行者123 更新时间:2023-11-29 01:01:27 24 4
gpt4 key购买 nike

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

标题:

  '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'

body :

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

理想的场景是 android 应用程序发出请求以获取此数据。 Api 返回数据,以及 43200 秒的最大年龄。

如果在 43200 秒之前发出请求,应用程序将缓存最后一个响应的数据。应用程序仍然发出请求,后端服务编译响应数据,使用请求的 etag 来决定响应数据是否已更改。如果数据已更改,它会返回 200 http 状态和数据。否则它会返回 403 状态并且没有数据。

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

如果在 43200 秒后发出请求,应用程序将不再具有缓存的响应或它的 etag。发出请求,数据被视为"new",即使数据中没有任何变化,状态代码 200 与 max-age header 一起返回,如上所示。

实际发生了什么:

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

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

我是否忽略了缓存、etag 和 max-age 的工作原理?

后端用node js搭建,路由使用express。

最佳答案

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

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

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

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

关于android - 请求不是从 android 应用发出的,设置了 max-age,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50860925/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com