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

时间:2018-08-30 21:40:21

标签: scala playframework

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

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

我的问题是,当我获取JSON资源时,用于计算哈希并为所提供的JSON表示形式设置etag值的惯用方式是什么?它是简单地检索JSON资源,计算哈希,设置标头并提供资源,还是Play提供了任何实用程序来做到这一点?还是有sbt插件可以做到这一点?

1 个答案:

答案 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哈希,但是似乎可以在CachedhandleResult的基础上实现类似的类修改为哈希Result的JSON正文。