【问题标题】:How to pass multiParams in scalatra如何在scalatra中传递multiParams
【发布时间】:2023-06-03 09:26:02
【问题描述】:

如果我想在 scalatra 的 get 请求中读取单个参数,可以按如下方式进行:

get("mypath/:id") {
 val id = params("id")
...
}

根据 scalatra 文档,我还可以使用 multiParams 来获取一系列参数:

val ids = multiParams("ids")

但它并没有说明如果我希望传递多个参数,应该如何形成 URL。那么如果我想传递多个 id,那么 URL 的格式是什么?

我尝试过使用与号、逗号和分号,但无济于事:例如

../mypath/id1&id2

【问题讨论】:

    标签: scala scalatra


    【解决方案1】:

    查看文档:http://scalatra.org/guides/2.4/http/routes.html

    例如,让我们使用 GET 访问一个 URL,如下所示:

    /articles/52?foo=uno&bar=dos&baz=three&foo=anotherfoo

    仔细看:里面有两个“foo”键。

    假设在/articles/:id 有匹配的路由,我们得到 动作中的以下结果:

    get("/articles/:id") {
      params("id") // => "52"
      params("foo") // => "uno" (discarding the second "foo" parameter value)
      params("unknown") // => generates a NoSuchElementException
      params.get("unknown") // => None - this is what Scala does with unknown keys in a Map
    
      multiParams("id") // => Seq("52")
      multiParams("foo") // => Seq("uno", "anotherfoo")
      multiParams("unknown") // => an empty Seq
    }
    

    所以你需要命名每个参数。例如/mypath/?ids=id1&ids=id2&ids=id3

    【讨论】:

    • 对我来说,文档中的 multiParams("id") => Seq("52") 意味着这种方法可以用于多个参数。即不必为每个参数传递名称。这就是促使我提出这个问题的原因。
    • @user79074,您要查找的是同一示例中的foo 参数吗?
    【解决方案2】:

    路径中可以嵌入多个同名参数,通过multiParams获取:

    // http://localhost:8080/articles/id1/id2
    get("/articles/:id/:id"){
      println(multiParams("id")) // => Seq("id1", "id2")
    }
    

    【讨论】: