Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 如何匹配路由中的特定接受标头?_Scala_Spray - Fatal编程技术网

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:\*}