4

我将以下标头发送到我的 akka-http api: "Content-type": "application/json", "Accept": "application/json", "AppId": "some_id".

如何在我的 akka-http 路由中获取“Ap​​pId”自定义标头?

(get & parameters("id")) { (id) =>
      complete {
        val appId = ?? // I want to get custom header here.
      }
    } 

谢谢。

4

2 回答 2

10

您需要使用HeaderDirectivesHeaderDirectives docs)之一来提取标题。例如,如果它是自定义的,您可以使用headerValueByName来生成标头的值,如果标头不存在则拒绝路由(如果标头是可选的,您可以使用optionalHeaderValueByName):

headerValueByName("AppId") { appId =>
  complete(s"The AppId was: $appId")
}

哈克快乐!

于 2015-09-16T22:25:34.803 回答
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 的条件响应的支持。

于 2015-10-30T11:41:30.667 回答