【问题标题】:Sometimes GET returns 304 instead of 200有时 GET 返回 304 而不是 200
【发布时间】:2017-12-01 00:51:36
【问题描述】:

我正在使用 node.js 和 mongodb。

我似乎有时会收到 200,而其他时候却没有修改 304。

router.get('/add-to-bag/:id', (req, res, next) => {
    req.session.bag.push(req.params.id);
    res.redirect('back');
    });
});

【问题讨论】:

  • 不应该......这不是 GET 请求,而是 POST 或 PUT?您正在执行一项操作,而不是获取信息

标签: node.js


【解决方案1】:

TL;DR:使用POST 请求而不是GET 请求。

GET 请求应该用于获取事物。 GET 请求不应影响应用程序(即服务器)的状态。

在您的情况下,将商品添加到购物袋显然是对服务器状态的修改

如果你不相信,check out this answer

在 HTTP 协议中以这种方式定义了 GET。它应该是幂等且安全的。

如果您使用POST 请求,它不仅可以解决您的 304 问题,而且还可以防止以后出现一些其他可能的错误。 (而且会更正确。)

【讨论】:

    【解决方案2】:

    我无法确定您使用什么堆栈来创建应用程序。看起来您正在使用 Express.js 进行路由。不过,我可以告诉你为什么你会得到 304。

    来自维基百科:

    304 未修改 (RFC 7232)
    表示资源自请求标头 If-Modified-Since 或 If-None-Match 指定的版本以来未被修改。在这种情况下,不需要重新传输资源,因为客户端仍然有一个先前下载的副本。[24]

    304 的意思是“嘿,还记得我给你的最后一个答案吗?它没有改变”,因此你的浏览器会重放它从缓存中收到的最后一个响应,而不会发生数据传输。

    这意味着您的数据正在被添加。但由于它是包中完全相同的数据,而不是再次给出完全相同数据的 200,服务器只发出 304。

    顺便说一句:您的 API 不是 Restful。我建议使用POST 创建新记录,而不是向其他 URL 发出 GET。我建议阅读 REST API 设计。一旦掌握了窍门,就很简单了。

    【讨论】:

      【解决方案3】:

      您是否尝试禁用 etag?

      app.disable('etag');
      

      【讨论】:

        【解决方案4】:

        只需将'Cache-Control': 'no-cache', 添加到我的标头即可绕过我遇到的 304 问题。见于this answer here

        【讨论】:

          猜你喜欢
          • 2021-06-18
          • 1970-01-01
          • 2011-04-14
          • 2011-11-09
          • 1970-01-01
          • 1970-01-01
          • 2015-06-28
          • 2019-07-02
          • 2018-06-28
          相关资源
          最近更新 更多