为 JSON 资源设置 ETAG 值的最佳方法



我不确定在使用Scala Playframework时什么是最佳方法以及如何为JSON资源设置ETAG值。

我的用例如下:我有一个服务,它将获取资源并将其显示在用户的浏览器中。在任何后续的 PUT 操作中,我想检查该资源在后端是否已更改。

我的问题是,当我获得 JSON 资源时,计算哈希并为提供的 JSON 表示形式设置 etag 值的惯用方法是什么。是简单地检索 JSON 资源、计算哈希、设置标头并提供资源,还是 Play 提供了任何实用程序来执行此操作,或者是否有可以执行此操作的 sbt 插件?

Play提供了Cached类来向Action添加缓存。下面是示例用法:

package controllers
import javax.inject._
import play.api.cache.{Cached, CachedBuilder}
import play.api.mvc._
import scala.concurrent.duration._
@Singleton
class HomeController @Inject()(cc: ControllerComponents, cached: Cached)(implicit assetsFinder: AssetsFinder)
extends AbstractController(cc) {
val cacheOk: CachedBuilder =
cached.status((req: RequestHeader) => "someKey", OK, 5.minutes)
def index: EssentialAction = cacheOk { Action {
Ok(views.html.index("Your new application is ready."))
}
}
}

Cached将添加ETag并处理If-None-Match。但是,它将到期日期的哈希设置为ETag

val etag = s""""${Codecs.sha1(expirationDate)}""""
val resultWithHeaders = result.withHeaders(ETAG -> etag, EXPIRES -> expirationDate)

我不知道Play提供了开箱即用的ETag作为JSON的哈希,但是似乎可以在Cached的基础上实现类似的类,handleResult修改为Result的哈希JSON主体。

相关内容

最新更新