相同的 HTTP GET 在第一次请求时状态为 200,之后为 304

Identical HTTP GET has status 200 on first request but 304 after that

我对Status Code 304“The HTTP 304 Not Modified client redirection response code indicates that there is no need to retransmit the requested resources”感到困惑,重传请求的资源指的是什么?

上下文:

  1. 我正在使用 JSON SERVER 模拟后端
  2. 每次我第一次请求url,都可以(200)
  3. 以下请求将导致状态 304

HTTP 304 的描述对我来说听起来很模糊,为什么我一开始就没有缓存来自 db.json 的数据,它会说不需要重传请求的资源。

客户代码:

fetch(`http://localhost:4000/profiles`)
    .then(res => res.json())
    .then(data => setProfiles(data));

服务器日志:

GET /profiles 200 1.970ms - - # The first request is status 200
GET /profiles 304 2.609ms - - # The subsequent requests are status 304
GET /profiles 304 2.951ms - -
GET /profiles 304 2.903ms - -
# ...

换句话说“HTTP 304 Not Modified 客户端重定向响应代码表示不需要重新传输请求的资源”:

您请求资源(来自 /profiles 的数据)一次,服务器向您发送状态为 200 OK 的数据。现在,当您请求相同的资源 (/profiles) 并且其数据与第一个请求相比没有变化时,服务器将以 304 Not Modified 响应,因为它假定您已经拥有数据——它还没有自 200 OK.

请求以来已修改

你说你没有在第一个请求中缓存数据,但服务器假设你会(就像MDN docs for 304 Not Modified说的那样,“它是对缓存资源的隐式重定向") 并试图节省资源。

您必须确定是否最适合您的具体情况

  • 缓存第一个响应,
  • 阅读可能的 Expires header 并仅在那个时刻之后重新请求,或者
  • 可能会省略 If-None-Match ETag header 以告诉服务器您没有要使用的资源的缓存版本