正确处理 Servant 中无效的查询参数
Correctly handle invalid query parameter in Servant
我跟随 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
我做错了什么?
克隆您的存储库后我无法重现该问题。经过检查,代码看起来都很好,除了不可靠的 fromJust
调用。
默认情况下,您的存储库甚至不会构建 - 必须修改 stack.yaml
文件以包含 allow-newer: true
字段。如果您使用的是 cabal
,那么就不可能知道您使用的是哪个版本的依赖项,这将使故障排除变得非常困难。
完成此操作后,我会收到您期望的消息:
并且所有排序工作正常。
您能否 post 有关您的系统的更多详细信息?您如何构建项目?正在使用哪些依赖项?
我跟随 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
我做错了什么?
克隆您的存储库后我无法重现该问题。经过检查,代码看起来都很好,除了不可靠的 fromJust
调用。
默认情况下,您的存储库甚至不会构建 - 必须修改 stack.yaml
文件以包含 allow-newer: true
字段。如果您使用的是 cabal
,那么就不可能知道您使用的是哪个版本的依赖项,这将使故障排除变得非常困难。
完成此操作后,我会收到您期望的消息:
并且所有排序工作正常。
您能否 post 有关您的系统的更多详细信息?您如何构建项目?正在使用哪些依赖项?