首页 > 解决方案 > 是否可以在 Play Framework 2.8 中的动作组合函数中将请求正文作为 JsValue 访问?

问题描述

在 Play 文档中,请求类型是动作组合函数的通用 [A]。我正在尝试向负责查询数据的每个端点添加一个自定义查询对象,为此我需要将请求正文作为 JsValue 并将其解析为适当的案例类。我似乎无法在操作中向 WrappedRequest 或优化方法添加类型,并且在优化方法中也不能这样做request.body.as[JsValue]。有没有办法完成以下?

我想在处理查询数据的端点中使用动作组合来做这样的事情:

def SomeEndpointWithAQuery() = auth.protectedAction(parse.json).andThen(QueryAction)) { request:QueryRequest[JsValue] =>
  val query = request.queryObject
  res = // Do query stuff
  Ok(res)
}

QueryRequest 是一个 WrappedRequest,它提供了一个查询对象:

class QueryRequest[A](val query: QueryParser, request: AuthUserRequest[A]) extends WrappedRequest[A](request) {
  def queryObject = query.parseQuery()
}


object QueryActionObject {
  def QueryAction()(implicit ec: ExecutionContext): ActionRefiner[AuthUserRequest, QueryRequest] = new ActionRefiner[AuthUserRequest, QueryRequest] {
    def executionContext: ExecutionContext = ec
    def refine[A](input: AuthUserRequest[A]) = Future.successful {
      val qp = new QueryParser(input.body.as[JsObject])
      if (qp.validate()) {
        Right(new QueryRequest(qp, input))
      } else {
        // bad request handling ...
      }
    }
  }
}

auth.protectedAction 是一个基于 request.session 信息添加用户信息的 actionBuilder,它不应该影响这个 queryAction 的工作方式。

标签: scalaplayframework

解决方案


推荐阅读