缓存REST API响应

缓存是指沿着请求 - 响应路径在多个位置存储经常访问的数据的副本的能力。当消费者请求资源表示时,该请求通过缓存或一系列缓存(本地缓存,代理缓存或反向代理)向托管资源的服务进行。如果请求路径中的任何高速缓存具有所请求表示的新副本,则它使用该副本来满足请求。如果没有任何缓存可以满足请求,则请求一直传输到服务(或正式知道的原始服务器)。

使用HTTP标头,源服务器指示是否可以缓存响应,如果是,则由谁,以及持续多长时间。响应路径上的高速缓存可以获取响应的副本,但前提是缓存元数据允许它们这样做。

使用缓存优化网络可通过以下方式改善整体服务质量:

  • 减少带宽
  • 减少延迟
  • 减少服务器上的负载
  • 隐藏网络故障

REST API中的缓存

作为缓存是REST架构约束之一。默认情况下,GET请求应该是可缓存的 - 直到出现特殊情况。通常,浏览器会将所有GET请求视为可缓存的。默认情况下,POST请求不可缓存,但如果Expires标头或Cache-Control带有指令的标头(明确允许缓存)添加到响应中,则可以使其可缓存。响应PUTDELETE请求根本不可缓存。

我们可以使用两个主要的HTTP响应头来控制缓存行为:

Expires

Expires HTTP标头指定缓存表示的绝对到期时间。超过那个时间,缓存的表示被认为是陈旧的,必须使用原始服务器重新验证。为了表明表示永不过期,服务可以包括将来长达一年的时间。

Expires: Fri, 20 May 2016 19:20:49 IST

Cache-Control

标头值包含一个或多个逗号分隔的指令。这些指令确定响应是否可缓存,如果是,可以由谁,以及多长时间,例如max-ages-maxage指令。

Cache-Control: max-age=3600

可缓存的响应(无论是GET还是POST请求)还应包括验证器 - ETag或Last-Modified标头。

ETag

ETag值是一个不透明的字符串标记,服务器将其与资源相关联,以便在其生命周期内唯一标识资源的状态。当资源发生变化时,ETag会相应地发生变化。

ETag: "abcd1234567n34jv"

Last-Modified

响应的Date标头指示生成响应的时间,而Last-Modified标头指示关联资源上次更改的时间。Last-Modified值不能晚于Date值。

Last-Modified: Fri, 10 May 2016 09:17:49 IST