请求不是来自Android应用,max-age设置为

时间:2018-06-14 15:21:14

标签: android caching http-headers okhttp max-age

我有一个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' 

BODY:

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

理想情况是android应用程序发出请求此数据的请求。 Api返回数据,最大年龄为43200秒。

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

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

如果在43200秒后发出请求,则应用程序不再具有缓存的响应或其标签。提出请求后,数据被视为新的'即使数据中没有任何变化,状态代码200也会与上面的max-age标题一起返回。

实际发生的事情:

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

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

我是否错过了缓存,etags和max-age如何工作的想法?

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

1 个答案:

答案 0 :(得分:1)

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

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

查看Google撰写的这篇文章,了解有关HTTP缓存的详细信息:  https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/http-caching

如果您需要深入了解如何从缓存构建响应,请查看RFC7234规范:https://tools.ietf.org/html/rfc7234#section-4