Akka-http:如何从请求中获取自定义标头?

use*_*710 4 akka spray akka-http

我在请求发送以下标题到我的阿卡-HTTP API: ,"Content-type": "application/json",."Accept": "application/json""AppId": "some_id"

如何在我的akka​​-http路由中获得"AppId"自定义标头?

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

谢谢.

Kon*_*ski 9

您需要使用其中一个HeaderDirectives(HeaderDirectives文档)来提取标题.例如,如果它是自定义的,您可以使用headerValueByName生成标头的值,如果标头不存在则拒绝路由(如果标头是可选的,您可以使用optionalHeaderValueByName):

headerValueByName("AppId") { appId =>
  complete(s"The AppId was: $appId")
}
Run Code Online (Sandbox Code Playgroud)

快乐的哈客!


exp*_*ert 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"))
}
Run Code Online (Sandbox Code Playgroud)

用的像

extractAppId { appId =>
 get {
  complete {
   "Your AppId is " + appId
  }
 }
}
Run Code Online (Sandbox Code Playgroud)

为了使我的示例更有趣,我添加了基于提供的AppId的条件响应的支持.