正确处理 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=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

我做错了什么?

克隆您的存储库后我无法重现该问题。经过检查,代码看起来都很好,除了不可靠的 fromJust 调用。

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

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

并且所有排序工作正常。

您能否 post 有关您的系统的更多详细信息?您如何构建项目?正在使用哪些依赖项?