Scala Play framework rest api добавить токен из запроса в ответ - PullRequest
0 голосов
/ 26 февраля 2020

Я пытаюсь сделать так, чтобы все мои остальные конечные точки API возвращали токен, с помощью которого пользователь делал запрос (уже существует во всех запросах). Вот так выглядит моя конечная точка basi c:

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

Как добавить к этому моему ответу информацию токена, полученную в запросе? Спасибо!

1 Ответ

0 голосов
/ 26 февраля 2020

Как вы описали в разделе комментариев, вам нужно получить токен из параметра запроса и добавить в него заголовок ответа. Давайте предположим, что этот токен является необязательным, следовательно, может отсутствовать, поэтому это может быть достигнуто примерно так:

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

Обновление

Для применения этой логики c для ВСЕХ маршрутов, вы можете использовать функцию Play Filters. Пожалуйста, смотрите do c для более подробной информации: https://www.playframework.com/documentation/latest/ScalaHttpFilters

Что вам нужно сделать:

1) Реализуйте свою собственную игру Filter. Это будет выглядеть примерно так:

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

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...