我不确定在使用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主体。