【问题标题】:Scala Play ReactiveMongo - Arbitrary list of query parametersScala Play ReactiveMongo - 查询参数的任意列表
【发布时间】:2016-06-13 01:16:48
【问题描述】:

我正在尝试支持从 MongoDB 获取文档列表的 REST API 的任意过滤器。 比如

  • //example.com/users
  • //example.com/users?age=30
  • //example.com/users?age=30&name=John
  • ...

我正在使用 Play-ReactiveMongo 并且只处理 JSONCollection 对象。

所以在我的路线中我放了

GET   /users        controllers.Users.list(id: Option[String], name: Option[String], age: Option[Int])

但这有两个问题,首先我需要一个很长的可选参数列表,然后在我的控制器中我需要对所有参数使用模式匹配来检查它们是否为空,并且还构建了我用来过滤我的集合的选择器。

var filters = JsObject(Nil)
name match {
  case Some(x) => filters += ("name" -> JsString(x))
  case None => None
}

我意识到我可以从请求对象中获取完整的查询字符串,即 Map[String, Seq[String]]。但是我不知道检查值是字符串还是其他东西的好方法。

还有其他更好的惯用方式来做我想做的事吗?

【问题讨论】:

    标签: scala playframework reactivemongo play-reactivemongo


    【解决方案1】:

    可能的解决方案是:

    1. 使用 POST 而不是 GET: 发布 /example.com/users "data"={"age":25, "name":"xyz", ... }
    2. 或 GET 中的单个参数: GET /example.com/users?filter={"age":25, "name":"xyz", ... }

    在服务器端,只需针对您的模型类进行验证,或者在您的 reactivemongo find 方法中传递相同的 json。

    【讨论】:

      【解决方案2】:

      也许请求绑定器会帮助您根据不同的请求参数创建复杂的对象。

      https://www.playframework.com/documentation/2.5.x/ScalaRequestBinders#QueryStringBindable

      例如,您可以构建这样的东西(来自文档):

      case class AgeRange(from: Int, to: Int)
      

      对于这样的请求:

      /age?from=1&to=10
      

      现在您可以将这些属性更改为 Option 并创建一个函数,该函数根据手头的值创建一个响应式mongo 查询。

      【讨论】:

        猜你喜欢
        • 2016-06-29
        • 1970-01-01
        • 2015-04-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-11
        • 2016-08-21
        相关资源
        最近更新 更多