未从android应用程序发出请求,已设置最大年龄

未从android应用程序发出请求,已设置最大年龄,android,caching,http-headers,okhttp,max-age,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

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

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

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

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

如果在43200秒后发出请求,则应用程序不再具有缓存响应或其etag。发出请求后,即使数据中没有任何更改,也会将数据视为“新的”,返回状态代码200以及如上所述的最大年龄标头

实际发生的情况:

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

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

我是否忘记了缓存、ETAG和最大年龄是如何工作的


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

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

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

有关HTTP缓存的详细概述,请参阅Google的这篇文章:


如果您需要关于如何从缓存构造响应的详细信息,请查看RFC7234规范:

android端的网络请求使用什么客户端?我不确定是否理解您的问题。客户端是我的队友正在开发的一款android应用程序。他是否在使用改型、HttpUrlConnection、Volley等,但这更多的是在android方面
{
id: 1985,
url: "https://example.com",
...
}