Lagom - 添加 header 到服务调用组合中的响应

Lagom - Add header to response in service call composition

我想编写代码在 Lagom 中刷新 cookie(通过 set-cookie http header)。
为澄清起见,Cookie 是一个编码字符串(例如 AES)。
让我们从 Implementing services 获取用于身份验证的 lagom 服务调用组合并对其进行编辑

def authenticated[Request, Response](
    serviceCall: User => ServerServiceCall[Request, Response]
) = ServerServiceCall.composeAsync { requestHeader =>
  
  //Get cookie from header and decode it
  val cookie = decodeCookie(requestHeader) 
 
  //Get user based on cookie decode function  
  val userLookup = getUser(cookie)

  userLookup.map {
    case Some(user) =>
        serviceCall(user)

    case None => throw Forbidden("User must be authenticated")
  }
}

可以操纵 serviceCall(user) 响应 headers?

我试过这样的事情:

serviceCall( employee ).handleResponseHeader { case (responseHeader, response) =>
    responseHeader.withHeader("Set-Cookie",encodeCookie("NewCookieStringExample")) // Add header
    response
}

但是函数 handleResponseHeader 只需要 response[T] 作为结果,header 不会改变,因为它是不可变的。

我知道我可以将 cookie 传递给 serviceCall(user) 并在每个服务调用实现中使用 ResponseHeader 和 Response return 元组,但这将影响所有端点并将添加更多代码。

也可以使用 HeaderFilter,但这会在一个请求中解码和编码 cookie 两次(在 header 过滤器和经过身份验证的服务调用组合中)

有什么建议吗?

您可以 return 修改后的 Header 和作为元组的响应:

serviceCall( employee ).handleResponseHeader((responseHeader, response) => {
     val modifiedHeader =  responseHeader.withHeader("Set-Cookie",encodeCookie("NewCookieStringExample")) // Add header
    (modifiedHeader, response)
})

顺便说一句,提供的示例不适合我。 composeAsync 想要 Future[ServerServiceCall[...]].