我将请求中的以下标头发送到我的akka-http api:"Content-type": "application/json"
,"Accept": "application/json"
,"AppId": "some_id"
。
我如何获得" AppId"我的akka-http路线中的自定义标题?
(get & parameters("id")) { (id) =>
complete {
val appId = ?? // I want to get custom header here.
}
}
感谢。
答案 0 :(得分:9)
您需要使用其中一个HeaderDirectives
(HeaderDirectives docs)来提取标头。例如,如果它是自定义的,您可以使用headerValueByName生成标头的值,如果标头不存在则拒绝路由(如果标头是可选的,您可以使用{{1} }):
optionalHeaderValueByName
快乐的交易!
答案 1 :(得分:6)
我实际上更喜欢为身份验证令牌,应用ID和其他参数创建自定义指令,这些参数对于服务客户端的请求是必需的。在你的情况下,它可能看起来像这样
val extractAppId = (headerValueByName("AppId") | headerValueByName("AppId2")).tflatMap[Tuple1[String]] {
case Tuple1(appId) =>
if (!appId.equalsIgnoreCase("BannedAppId"))
provide(appId)
else
complete(StatusCodes.Forbidden -> "Your application is banned")
}.recover {
case rejections => reject(ValidationRejection("AppId is not provided"))
}
用于
extractAppId { appId =>
get {
complete {
"Your AppId is " + appId
}
}
}
为了让我的示例更有趣,我添加了基于提供的AppId的条件响应支持。