Scala 如何匹配路由中的特定接受标头?
我想创建一个仅当客户端发送特定的Scala 如何匹配路由中的特定接受标头?,scala,spray,Scala,Spray,我想创建一个仅当客户端发送特定的Accept头时才匹配的路由。我使用喷雾1.2-20130822 我想让路线正常运行: def receive = runRoute { get { path("") { accept("application/json") { complete(...) } } } } 我使用accept()函数找到了一个规范,但我不知道应该在我的喷洒处理程序中导入什么才能使它作
Accept
头时才匹配的路由。我使用喷雾1.2-20130822
我想让路线正常运行:
def receive = runRoute {
get {
path("") {
accept("application/json") {
complete(...)
}
}
}
}
我使用
accept()
函数找到了一个规范,但我不知道应该在我的喷洒处理程序中导入什么才能使它作为指令工作。此外,我没有在标题指令中找到其他文档,但找到了这些指令。没有名为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))
}
将此代码放在喷洒路线的范围内,然后按照问题中所示使用。我会这样做:
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))
}
}
}
}
顺便说一句,最新的spray 1.2 nightly是
1.2-20130928
,如果可以的话,请更新它谢谢你的帮助。虽然我可能应该将if actual==required
更改为if actual.split(“,”)包含required
或类似的内容。这里有一个小错误:${mr:\*}
的字符串插值在传入多个MediaRange
且没有匹配时失败。如果我将其更改为${mr}
,它将运行,尽管输出包含mr
的类型,这可能不是预期的。@Romptroll抱歉,我不知道,谢谢。您可以用${mr.mkString(“,”)替换${mr:\*}