Rest 使用HTTP管理API资源缓存

Rest 使用HTTP管理API资源缓存,rest,http,caching,api-design,Rest,Http,Caching,Api Design,我目前正在使用ASP MVC API开发一个SPA。我们最近在API响应上添加了通过HTTP头的客户端缓存,根据预期的更改频率使用适当的最大年龄值 虽然这有助于提高性能,但我们现在遇到了一个问题,即用户自己进行更改,然后在重新加载页面时使用旧数据进行缓存命中 为了解决这个问题,我在GET请求中添加了一个版本参数,该参数在每次更改时都会递增 然而,我现在发现POST、PUT或DELETE请求应该使GET请求的缓存对同一URI无效 有鉴于此,我想知道如何更好地设计我的API,这样版本参数就没有必要了

我目前正在使用ASP MVC API开发一个SPA。我们最近在API响应上添加了通过HTTP头的客户端缓存,根据预期的更改频率使用适当的最大年龄值

虽然这有助于提高性能,但我们现在遇到了一个问题,即用户自己进行更改,然后在重新加载页面时使用旧数据进行缓存命中

为了解决这个问题,我在GET请求中添加了一个版本参数,该参数在每次更改时都会递增

然而,我现在发现POST、PUT或DELETE请求应该使GET请求的缓存对同一URI无效

有鉴于此,我想知道如何更好地设计我的API,这样版本参数就没有必要了,浏览器会自动处理这个问题

例如:我有

  • GET/resource-返回所有资源的集合
  • 发布/资源-创建新资源
  • GET/resource/{id}-获取具有指定id的资源
  • PUT/resource/{id}-使用指定的id更新资源
  • 请求2将使1无效,请求4将使3无效,但请求4也应使1无效

    这是正确的行为吗?或者请求1是否应该返回所有资源的ID集合,我应该为每个ID分别请求3个。这似乎无效,因为它将在100个请求中而不是1个请求中解决


    是否有一个简单的解决方案?

    在您引用的同一章中,规范说明:

    请注意,这并不能保证所有适当的响应都是正确的 无效

    在分布式环境中,失效是一项非常困难的任务。可能有其他缓存或其他资源依赖于相同的数据(如您的情况)。这意味着不应该尝试,只将其计划到系统中更便宜

    一个“解决方法”是让客户机强制更新它知道必须更改的资源,因为
    PUT
    。因此,您可以请求自己(以及缓存)使用以下标头更新“父”资源的表示:

    Cache-Control: max-age=0
    
    同样,其他缓存可能仍然有过期但仍然有效的缓存响应,但它解决了在同一台计算机上不接收同一进程的冲突信息的问题


    因此,我不会“规范化”表示以只返回URI而不返回任何数据,我宁愿以一种尽可能避免此类问题的方式设计工作流。如果没有,请强制刷新(如上所述),设置足够小的缓存时间,或者在其他所有操作都失败时不缓存。

    谢谢,您已经基本确认了我的预期。这从一开始就是一个糟糕的设计项目,在改造时,缓存直到最后才被视为性能问题的解决方案。现在我正在改装缓存失效。下次我会尽量设计得更好:)