3

我想“更改”设置在controllers.Assets.at.

  • 我想添加一个自定义标签(我可以按照这里withHeaders的解释来做到这一点)
  • 我想删除之前设置的标签。如Etag

由于.withHeaders附加或覆盖现有标题,我无法使用它删除。对于 Cookies 有,discardingCookies但我无法看到类似的标题。

并且由于header: ResponseHeaderis a valinPlainResult我不能直接改变它的值。

如何删除 Play Framework 2.x Scala 中已设置的标签?

我正在尝试做的代码示例:

def at(file: String): Action[AnyContent] = CacheForever(Assets.at(assetDistDirectory, file))

def CacheForever[A](action: Action[A]): Action[A] = Action(action.parser) { request =>
  action(request) match {
    case s: SimpleResult[_] => {
      s.withHeaders(
        "mycustomheader" -> "is_set_here"
      )
      s.withOutHeaders("Etag","AnotherTagSetByAssetsAtButIDontWant")   
      // <--- I need something like the above line.
    }
    case result => result
  }
}
4

1 回答 1

2

您可以使用一个稍加修正的实现:withHeaders

val without = Seq("Etag","AnotherTagSetByAssetsAtButIDontWant")
implicit val writeable: Writeable[A] = s.writeable
s.copy(header = s.header.copy(headers = s.header.headers -- without) )

使用隐式类:

implicit class SimpleResultHelper[A](val r: SimpleResult[A]) extends AnyVal {
  def withOutHeaders(without: String*): SimpleResult[A] = {
    import r.writeable
    r.copy(header = r.header.copy(headers = r.header.headers -- without ))
  }
}

用法:

val newS = s.withOutHeaders("Etag", "AnotherTagSetByAssetsAtButIDontWant")

SimpleResult是 a并且在所有es中case class都有方法。copycase class

Fieldheader是 case 类的实例,ResponseHeader其字段headers类型为Map[String, String]

于 2013-06-26T12:47:29.047 回答