首页 > 解决方案 > 正确处理 Servant 中的无效查询参数

问题描述

我正在跟随Servant 教程,并且我定义了以下 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=namecurl 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

我究竟做错了什么?

标签: haskellservant

解决方案


克隆您的存储库后,我无法复制该问题。检查时,代码看起来都很好,除了那些狡猾的fromJust调用。

默认情况下,您的存储库甚至不构建 -stack.yaml必须修改文件以包含该allow-newer: true字段。如果您正在使用cabal,则无法知道您正在使用哪些版本的依赖项,这将使故障排除变得非常困难。

完成此操作后,我会得到您所期望的消息:

预期的错误输出

所有的排序工作都很好。

你能在你的系统上发布更多细节吗?你是如何构建这个项目的?使用了哪些依赖项?


推荐阅读