Scala-Play框架rest api将令牌从请求添加到响应



我正试图让我的所有rest api端点返回用户用于发出请求的令牌(已存在于所有请求中(。我的基本端点是这样的:

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))
}

更新

为了将此逻辑应用于所有路线,您可以使用播放过滤器功能。请参阅文档了解更多详细信息:https://www.playframework.com/documentation/latest/ScalaHttpFilters

你需要做什么:

1( 实现您自己的PlayFilter。它看起来像下一个:

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

希望这能有所帮助!

最新更新