【问题标题】:Passing request params in play scala在 play scala 中传递请求参数
【发布时间】:2013-10-25 08:55:36
【问题描述】:

我是新玩框架 (scala) 的新手,但我仍然在通过我的第一个 Web 应用程序。 我刚刚在我的控制器中创建了第一个方法,索引:

 def index = UserAwareContextAction { implicit request =>
val subset = request.params.get("subset").getOrElse("all")
request.user match {
  case Some(user) => selectIndex(request, subset)
  case _ => Ok(views.html.index())
}

现在我需要弄清楚如何将参数实际添加到我的索引请求中,我有一个导航 scala 类:

  val index                     =   GET.on(root).to{Application.index_}

所以我不太确定这应该如何相关,在哪里声明请求参数,如何传递它? 我不知道为什么播放文档似乎与我无关。请任何帮助,或有关如何盯着看的有用教程,我将不胜感激。

【问题讨论】:

  • 第二个 sn-p 似乎是重定向。第一个具有 request 作为隐式参数(它由框架为每个操作提供)。您能否更具体地说明您想要实现的目标?

标签: scala playframework httpwebrequest playframework-2.0 navigationcontroller


【解决方案1】:

至少有两种方法。

第一:

您可以让 Play 为您解析来自 url 的参数: 例如,您需要将 user_id 传递给您的索引页面,那么您的 GET 请求的 url 可能是这样的:

/index/1

并在播放根文件:

GET /index/:user_id      Controllers.Application.index(user_id : Int)

所以在这种情况下,play 将从您的请求 url 中为您解析 user_id 为 1。 或者您的要求可能如下:

/index?user_id=1 并在您的根目录中:

GET /index      Controllers.Application.index(user_id : Int) 

再次为你解析它,user_id 为 1。

在两种情况下,您会在控制器中将此 user_id 作为参数:

def index(user_id : Int) = Action{implicit request =>
       // user_id == 1
       ......
       Ok("")
}

另一个:

直接从控制器中的请求中获取参数,例如使用Request method queryString 作为Map,您的控制器可能如下所示:

 def index = Action{ request =>
 // you get your params as Map[String,Seq[String]] where `key` is you parameter `name` and value is //wraped in to a Seq 
    val params = request.queryString
     // or if you want to flatten it to Map[String,Option[String]] for example    
       val params = request.queryString.map {case(k,v) => k->v.headOption}  
       .....    
       Ok("")
        }

对于这种情况,根很简单:GET /index Controllers.Application.index

【讨论】:

  • 好吧,当您使用默认的 conf/routes 时,恐怕这两种方法都是正确的。在我的情况下,我使用的是 nav.scala 类,它是一个导航库,但我可以告诉你如何传递参数!
【解决方案2】:

通常,带有参数的播放控制器如下所示:

// Controller
def get(id: Long) = Action { implicit request =>
  // do stuff
  val someArgument = ...
  Ok(views.html.index(someArgument))

// route
GET    /account/:id      AccountController.get(id: Long)

如果您尝试访问查询字符串参数,只需调用 request.queryString 即可从 implicit request 访问这些参数

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-05
    • 2021-09-24
    • 2022-10-06
    • 1970-01-01
    相关资源
    最近更新 更多