diff --git a/docs/pages/1 - Cask: a Scala HTTP micro-framework.md b/docs/pages/1 - Cask: a Scala HTTP micro-framework.md index a66811bad8..5cfeeb52fd 100644 --- a/docs/pages/1 - Cask: a Scala HTTP micro-framework.md +++ b/docs/pages/1 - Cask: a Scala HTTP micro-framework.md @@ -139,10 +139,16 @@ $$$variableRoutes You can bind variables to endpoints by declaring them as parameters: these are either taken from a path-segment matcher of the same name (e.g. `postId` above), -or from query-parameters of the same name (e.g. `param` above). You can make -`param` take a `: String` to match `?param=hello`, an `: Int` for `?param=123` a -`Seq[T]` (as above) for repeated params such as `?param=hello¶m=world`, or -`: Option[T]` for cases where the `?param=hello` is optional. +or from query-parameters of the same name (e.g. `param` above). You can make `param` take + +* `param: String` to match `?param=hello` +* `param: Int` for `?param=123` +* `param: Option[T] = None` or `param: String = "DEFAULT VALUE"` for cases where the + `?param=hello` is optional. +* `param: Seq[T]` for repeated params such as `?param=hello¶m=world` with at + least one value +* `param: Seq[T] = Nil` for repeated params such as `?param=hello¶m=world` allowing + zero values If you need to capture the entire sub-path of the request, you can set the flag `subpath=true` and ask for a `request: cask.Request` (the name of the param doesn't diff --git a/example/variableRoutes/app/src/VariableRoutes.scala b/example/variableRoutes/app/src/VariableRoutes.scala index c9e55bf08d..8488af5921 100644 --- a/example/variableRoutes/app/src/VariableRoutes.scala +++ b/example/variableRoutes/app/src/VariableRoutes.scala @@ -6,7 +6,27 @@ object VariableRoutes extends cask.MainRoutes{ } @cask.get("/post/:postId") - def showPost(postId: Int, param: Seq[String]) = { + def showPost(postId: Int, param: String) = { // Mandatory query param + s"Post $postId $param" + } + + @cask.get("/post2/:postId") // Optional query param + def showPostOptional(postId: Int, param: Option[String] = None) = { + s"Post $postId $param" + } + + @cask.get("/post3/:postId") // Optional query param with default + def showPostDefault(postId: Int, param: String = "DEFAULT VALUE") = { + s"Post $postId $param" + } + + @cask.get("/post4/:postId") // 1-or-more query param + def showPostSeq(postId: Int, param: Seq[String]) = { + s"Post $postId $param" + } + + @cask.get("/post5/:postId") // 0-or-more query param + def showPostOptionalSeq(postId: Int, param: Seq[String] = Nil) = { s"Post $postId $param" } diff --git a/example/variableRoutes/app/test/src/ExampleTests.scala b/example/variableRoutes/app/test/src/ExampleTests.scala index c818ee8126..c956a59087 100644 --- a/example/variableRoutes/app/test/src/ExampleTests.scala +++ b/example/variableRoutes/app/test/src/ExampleTests.scala @@ -27,23 +27,70 @@ object ExampleTests extends TestSuite{ assert( - requests.get(s"$host/post/123?param=xyz¶m=abc").text() == + requests.get(s"$host/post/123?param=xyz").text() == + "Post 123 xyz" + ) + + requests.get(s"$host/post/123", check = false).text() ==> + """Missing argument: (param: String) + | + |Arguments provided did not match expected signature: + | + |showPost + | postId Int + | param String + | + |""".stripMargin + + assert( + requests.get(s"$host/post2/123?param=xyz").text() == + "Post 123 Some(xyz)" + ) + + assert( + requests.get(s"$host/post2/123").text() == + "Post 123 None" + ) + + assert( + requests.get(s"$host/post3/123?param=xyz").text() == + "Post 123 xyz" + ) + + assert( + requests.get(s"$host/post3/123").text() == + "Post 123 DEFAULT VALUE" + ) + + + assert( + requests.get(s"$host/post4/123?param=xyz¶m=abc").text() == "Post 123 ArraySeq(xyz, abc)" || - requests.get(s"$host/post/123?param=xyz¶m=abc").text() == + requests.get(s"$host/post4/123?param=xyz¶m=abc").text() == "Post 123 ArrayBuffer(xyz, abc)" ) - requests.get(s"$host/post/123", check = false).text() ==> + requests.get(s"$host/post4/123", check = false).text() ==> """Missing argument: (param: Seq[String]) | |Arguments provided did not match expected signature: | - |showPost + |showPostSeq | postId Int | param Seq[String] | |""".stripMargin + assert( + requests.get(s"$host/post5/123?param=xyz¶m=abc").text() == + "Post 123 ArraySeq(xyz, abc)" || + requests.get(s"$host/post5/123?param=xyz¶m=abc").text() == + "Post 123 ArrayBuffer(xyz, abc)" + ) + assert( + requests.get(s"$host/post5/123").text() == "Post 123 List()" + ) + requests.get(s"$host/path/one/two/three").text() ==> "Subpath List(one, two, three)"