def acceptOnly(mr: MediaRange*): Directive0 =
extract(_.request.headers).flatMap[HNil] {
case headers if headers.contains(Accept(mr)) ⇒ pass
case _ ⇒ reject(MalformedHeaderRejection("Accept", s"Only the following media types are supported: ${mr.mkString(", ")}"))
} & cancelAllRejections(ofType[MalformedHeaderRejection])
path("") {
get {
acceptOnly(`application/json`) {
session { creds ⇒
complete(html.page(creds))
}
}
}
}
顺便提一下,最新的喷雾器1.2夜间版是1.2-20130928
,如果可以,请更新它。
没有预定义的指令叫做accept
指令。您可以在此处查看可用指令的完整列表。
但是,您可以使用headerValueByName
指令来创建一个自定义指令,以实现您所需的功能:
def accept(required: String) = headerValueByName("Accept").flatMap {
case actual if actual.split(",").contains(required) => pass
case _ => reject(MalformedHeaderRejection("Accept", "Accept must be equal to " + required))
}
将这段代码放在您的spray Route
范围内,然后按照您在问题中展示的方式使用即可。
if actual == required
更改为 if actual.split(",") 包含 required
或类似的内容。 - rompetroll
MediaRange
并且没有匹配到任何一个,${mr: _*}
的字符串插值会失败。如果我将其更改为${mr}
,它就可以运行,尽管输出现在包含了mr
的类型,这可能不是预期的结果。 - rompetroll${mr.mkString(", ")}
替换${mr: _*}
。 - 4lex1v