【问题标题】:Correctly handle invalid query parameter in Servant正确处理 Servant 中的无效查询参数
【发布时间】: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=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

我做错了什么?

【问题讨论】:

  • 这里有完整的源代码:github.com/tomasaschan/hello-servant
  • 看过您的代码后,我强烈怀疑(尽管不确定)错误来自您在ToJSONCalendarDate Gregorian 实例中使用printf。不幸的是,我对这些库中的任何一个都不熟悉,而且这些类型看起来足够“神奇”,以至于我无法在简单地阅读文档后解码你的代码试图做什么。
  • 虽然这当然不能解释为什么在指定允许的排序顺序时会得到预期的结果,所以也许不是这样。

标签: haskell servant


【解决方案1】:

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

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

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

所有的排序工作都很好。

您能否发布有关您系统的更多详细信息?你是如何构建这个项目的?使用了哪些依赖项?

【讨论】:

  • 这很有趣。至少它证实了我对事情应该如何工作的理解离机器人太远了。我要删除我的 .stack-work 文件夹并重试...
  • 好的,我发现了错误。它与我的 Haskell 代码完全无关,而是由我查看响应的方式引起的。为了更容易阅读,我将curl 的输出通过管道传输到jq,它显示了我看到的错误消息。换句话说,您将能够使用curl localhost:8081/users?sortby=foo | jq 进行复制。感谢您尝试并让我相信 Haskell 代码是正确的!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-05
  • 1970-01-01
  • 1970-01-01
  • 2012-01-01
  • 2021-04-10
  • 2019-07-19
相关资源
最近更新 更多