我不确定使用Scala Playframework时最好的方法是什么以及如何为JSON资源设置ETAG值。
我的用例如下:我有一个服务,它将获取资源并将其显示在用户的浏览器中。在任何后续的PUT操作中,我想检查后端的资源是否已更改。
我的问题是,当我获取JSON资源时,用于计算哈希并为所提供的JSON表示形式设置etag值的惯用方式是什么?它是简单地检索JSON资源,计算哈希,设置标头并提供资源,还是Play提供了任何实用程序来做到这一点?还是有sbt插件可以做到这一点?
答案 0 :(得分:1)
播放提供了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
。但是,它将expiration date的哈希设置为ETag
:
val etag = s""""${Codecs.sha1(expirationDate)}""""
val resultWithHeaders = result.withHeaders(ETAG -> etag, EXPIRES -> expirationDate)
我不知道Play提供了现成的ETag
作为JSON哈希,但是似乎可以在Cached
和handleResult
的基础上实现类似的类修改为哈希Result
的JSON正文。