Scala Play framework rest api将令牌从请求添加到响应

Scala Play framework rest api将令牌从请求添加到响应,scala,rest,playframework,Scala,Rest,Playframework,我正试图让我的所有RESTAPI端点返回用户用来发出请求的令牌(已经存在于所有请求中)。 这就是我的基本端点的外观: def getAll(meta: MetaData): Action[AnyContent] = deadbolt.Restrict(role)(parse.default) { implicit request => myService.getAll(meta).map(result => { val results: Seq[Resp]

我正试图让我的所有RESTAPI端点返回用户用来发出请求的令牌(已经存在于所有请求中)。 这就是我的基本端点的外观:

def getAll(meta: MetaData): Action[AnyContent] = deadbolt.Restrict(role)(parse.default) { 
    implicit request => myService.getAll(meta).map(result => {
        val results: Seq[Resp] = result._2.map(res => Mapper(res))
        Ok(Json.toJson(MyListResponse.apply(meta, result._1, results)))
    })
}
如何将从请求中接收到的令牌信息添加到我的响应中?
谢谢

正如您在注释部分所述,您需要从查询参数中获取令牌,并将其添加到响应头中。假设此标记是可选的,因此可能不存在,因此可以通过以下方式实现:

implicit request => myService.getAll(meta).map { result => 
   // Fetch optional token as query parameter. `token_parameter` - parameter key
   val requestToken = request.queryString.get("token_parameter").flatMap(_.headOption)
   val results: Seq[Resp] = result._2.map(res => Mapper(res))
   val body = Json.toJson(MyListResponse.apply(meta, result._1, results))

   // Add token to header if it is present
   requestToken.fold(Ok(body))(token => Ok(body).withHeaders("token_header" -> token))
}
更新

为了将此逻辑应用于所有路由,可以使用播放过滤器功能。有关更多详细信息,请参见文件:

您需要做的是:

1) 实现您自己的播放
过滤器
。它看起来像下一个:

import javax.inject.Inject
import akka.stream.Materializer
import play.api.mvc._
import scala.concurrent.ExecutionContext
import scala.concurrent.Future

class TokenFilter @Inject() (implicit val mat: Materializer, ec: ExecutionContext) extends Filter {
      def apply(nextFilter: RequestHeader => Future[Result])
               (requestHeader: RequestHeader): Future[Result] = {
            nextFilter(requestHeader).map { result =>
                val requestToken = requestHeader.queryString.get("token_parameter").flatMap(_.headOption)
                requestToken.fold(result )(token => result.withHeaders("token_header" -> token))
            }
    }
}

2) 将过滤器连接到应用程序的其余部分。例如,通过在
application.conf

play.http.filters += com.yourcomany.TokenFilter

希望这有帮助

大家好,欢迎来到SO。请提供有关请求令牌的信息:这是某个标头还是查询参数?您希望如何将其发回:作为响应头还是主体?谢谢,我希望令牌是我请求中的一个参数,在所有响应中作为头返回。谢谢你的回答。我需要能够对我的所有端点进行此更改,因此我需要能够包装端点一部分、转换结果的内容,即添加标记并返回包含原始结果和标记的内容。有什么想法吗?谢谢@塔米尔。哦,对不起,我错过了。当然,我有个主意,请让我更新一下答案。谢谢你的评论。@tafirm。我已经发布了最新消息。再次感谢您的评论。