Skip to content

Commit

Permalink
Flesh out examples for query param handling (#107)
Browse files Browse the repository at this point in the history
  • Loading branch information
lihaoyi authored Jan 4, 2024
1 parent 6f91d75 commit db650ab
Show file tree
Hide file tree
Showing 3 changed files with 90 additions and 17 deletions.
14 changes: 10 additions & 4 deletions docs/pages/1 - Cask: a Scala HTTP micro-framework.md
Original file line number Diff line number Diff line change
Expand Up @@ -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&param=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&param=world` with at
least one value
* `param: Seq[T] = Nil` for repeated params such as `?param=hello&param=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
Expand Down
32 changes: 26 additions & 6 deletions example/variableRoutes/app/src/VariableRoutes.scala
Original file line number Diff line number Diff line change
@@ -1,22 +1,42 @@
package app
object VariableRoutes extends cask.MainRoutes{
@cask.get("/user/:userName")
def showUserProfile(userName: String) = {
def getUserProfile(userName: String) = {
s"User $userName"
}

@cask.get("/post/:postId")
def showPost(postId: Int, param: Seq[String]) = {
s"Post $postId $param"
@cask.get("/article/:articleId")
def getArticle(articleId: Int, param: String) = { // Mandatory query param
s"Article $articleId $param"
}

@cask.get("/article2/:articleId") // Optional query param
def getArticleOptional(articleId: Int, param: Option[String] = None) = {
s"Article $articleId $param"
}

@cask.get("/article3/:articleId") // Optional query param with default
def getArticleDefault(articleId: Int, param: String = "DEFAULT VALUE") = {
s"Article $articleId $param"
}

@cask.get("/article4/:articleId") // 1-or-more query param
def getArticleSeq(articleId: Int, param: Seq[String]) = {
s"Article $articleId $param"
}

@cask.get("/article5/:articleId") // 0-or-more query param
def getArticleOptionalSeq(articleId: Int, param: Seq[String] = Nil) = {
s"Article $articleId $param"
}

@cask.get("/path", subpath = true)
def showSubpath(request: cask.Request) = {
def getSubpath(request: cask.Request) = {
s"Subpath ${request.remainingPathSegments}"
}

@cask.post("/path", subpath = true)
def postShowSubpath(request: cask.Request) = {
def postArticleSubpath(request: cask.Request) = {
s"POST Subpath ${request.remainingPathSegments}"
}

Expand Down
61 changes: 54 additions & 7 deletions example/variableRoutes/app/test/src/ExampleTests.scala
Original file line number Diff line number Diff line change
Expand Up @@ -27,23 +27,70 @@ object ExampleTests extends TestSuite{


assert(
requests.get(s"$host/post/123?param=xyz&param=abc").text() ==
"Post 123 ArraySeq(xyz, abc)" ||
requests.get(s"$host/post/123?param=xyz&param=abc").text() ==
"Post 123 ArrayBuffer(xyz, abc)"
requests.get(s"$host/article/123?param=xyz").text() ==
"Article 123 xyz"
)

requests.get(s"$host/post/123", check = false).text() ==>
requests.get(s"$host/article/123", check = false).text() ==>
"""Missing argument: (param: String)
|
|Arguments provided did not match expected signature:
|
|getArticle
| articleId Int
| param String
|
|""".stripMargin

assert(
requests.get(s"$host/article2/123?param=xyz").text() ==
"Article 123 Some(xyz)"
)

assert(
requests.get(s"$host/article2/123").text() ==
"Article 123 None"
)

assert(
requests.get(s"$host/article3/123?param=xyz").text() ==
"Article 123 xyz"
)

assert(
requests.get(s"$host/article3/123").text() ==
"Article 123 DEFAULT VALUE"
)


assert(
requests.get(s"$host/article4/123?param=xyz&param=abc").text() ==
"Article 123 ArraySeq(xyz, abc)" ||
requests.get(s"$host/article4/123?param=xyz&param=abc").text() ==
"Article 123 ArrayBuffer(xyz, abc)"
)

requests.get(s"$host/article4/123", check = false).text() ==>
"""Missing argument: (param: Seq[String])
|
|Arguments provided did not match expected signature:
|
|showPost
| postId Int
|getArticleSeq
| articleId Int
| param Seq[String]
|
|""".stripMargin

assert(
requests.get(s"$host/article5/123?param=xyz&param=abc").text() ==
"Article 123 ArraySeq(xyz, abc)" ||
requests.get(s"$host/article5/123?param=xyz&param=abc").text() ==
"Article 123 ArrayBuffer(xyz, abc)"
)
assert(
requests.get(s"$host/article5/123").text() == "Article 123 List()"
)

requests.get(s"$host/path/one/two/three").text() ==>
"Subpath List(one, two, three)"

Expand Down

0 comments on commit db650ab

Please sign in to comment.