scala play 动作组合响应 header
scala play action composition response header
我正在通过阅读请求 header 为 api 授权使用动作组合。我想在响应 header 上注入身份验证令牌,以便客户端可以使用它在连续调用中调用 API。到目前为止,我已经使用动作组合拦截了请求,我可以在到达控制器代码之前设置响应 header 还是只能在控制器代码上完成?
可以将响应 header 注入到下面的 invokeBlock 中吗?
def invokeBlock[A](request: Request[A], block: AuthorizedRequest[A] => Future[Result]): Future[Result] = {
val requestToken = sessionTokenPair(request)
requestToken match {
case Some(token) => {
AuthenticationManager.validateAPIToken(token).map { sh =>
block(new AuthorizedRequest(sh, request))
}.getOrElse{
Future.successful(Forbidden(Json.toJson(
Error(status = Status.FORBIDDEN,errorCode = 43, message = "Bad Request",developerMessage="Issue")
)))
}
}
case _ => {
Future.successful(Forbidden(Json.toJson(
Error(status = Status.FORBIDDEN,errorCode = 43, message = "Bad Request",developerMessage="Issue")
)))
}}
}
}`enter code here`
是的,invokeBlock
是执行此操作的好地方 - 当然无需在每个控制器中重复自己。
在您的 "success" 案例中,您有:
block(new AuthorizedRequest(sh, request))
你实际上是在返回 block()
给你的 Future[Result]
。
要添加额外的 headers,只需 map
覆盖 Future
并使用 handy methods on Result
:
添加它们
block(new AuthorizedRequest(sh, request)).map { result =>
result.withHeaders(
"x-foo" -> "f00",
"x-bar" -> "bar")
}
我正在通过阅读请求 header 为 api 授权使用动作组合。我想在响应 header 上注入身份验证令牌,以便客户端可以使用它在连续调用中调用 API。到目前为止,我已经使用动作组合拦截了请求,我可以在到达控制器代码之前设置响应 header 还是只能在控制器代码上完成?
可以将响应 header 注入到下面的 invokeBlock 中吗?
def invokeBlock[A](request: Request[A], block: AuthorizedRequest[A] => Future[Result]): Future[Result] = {
val requestToken = sessionTokenPair(request)
requestToken match {
case Some(token) => {
AuthenticationManager.validateAPIToken(token).map { sh =>
block(new AuthorizedRequest(sh, request))
}.getOrElse{
Future.successful(Forbidden(Json.toJson(
Error(status = Status.FORBIDDEN,errorCode = 43, message = "Bad Request",developerMessage="Issue")
)))
}
}
case _ => {
Future.successful(Forbidden(Json.toJson(
Error(status = Status.FORBIDDEN,errorCode = 43, message = "Bad Request",developerMessage="Issue")
)))
}}
}
}`enter code here`
是的,invokeBlock
是执行此操作的好地方 - 当然无需在每个控制器中重复自己。
在您的 "success" 案例中,您有:
block(new AuthorizedRequest(sh, request))
你实际上是在返回 block()
给你的 Future[Result]
。
要添加额外的 headers,只需 map
覆盖 Future
并使用 handy methods on Result
:
block(new AuthorizedRequest(sh, request)).map { result =>
result.withHeaders(
"x-foo" -> "f00",
"x-bar" -> "bar")
}