【发布时间】:2020-04-22 20:08:22
【问题描述】:
我正在关注the Servant tutorial,并且我定义了以下 API 类型:
type UsersAPI = "users" :> QueryParam "sortby" SortBy :> Get '[JSON] [UserData]
data SortBy = Id | Name | Age
instance FromHttpApiData SortBy where
parseQueryParam input =
case toLower input of
"name" -> Right Name
"age" -> Right Age
_ -> Left $ append "Invalid sort order: " input
listUsers :: Maybe SortBy -> Handler [UserData]
listUsers = return . Db.getUsers . fromMaybe Id -- Db.getUsers just returns a a sorted in-memory list...
-- rest of implementation ommitted for brevity
有些事情显然是正确的,因为如果我 curl localhost:8081/users?sortby=name 或 curl localhost:8081/users?sortby=age 我得到一个正确排序的列表。但是,有些东西也坏了,因为curl localhost:8081/users?sortby=foo 没有给我预期的Invalid sort order: foo。相反,我得到了
parse error: Invalid numeric literal at line 1, column 6
我做错了什么?
【问题讨论】:
-
这里有完整的源代码:github.com/tomasaschan/hello-servant
-
看过您的代码后,我强烈怀疑(尽管不确定)错误来自您在
ToJSON的CalendarDate Gregorian实例中使用printf。不幸的是,我对这些库中的任何一个都不熟悉,而且这些类型看起来足够“神奇”,以至于我无法在简单地阅读文档后解码你的代码试图做什么。 -
虽然这当然不能解释为什么在指定允许的排序顺序时会得到预期的结果,所以也许不是这样。