gpt4 book ai didi

haskell - Servant QueryParams 解析错误

转载 作者:行者123 更新时间:2023-12-02 18:26:21 26 4
gpt4 key购买 nike

给出以下代码:

newtype HelloMessage = HelloMessage { msg :: String }
deriving (Generic)

instance ToJSON HelloMessage

type API2 = "hello"
:> QueryParam "age" Int
:> Get '[JSON] HelloMessage

appAPI2 :: Proxy API2
appAPI2 = Proxy

myHandler :: Server API2
myHandler = helloHandler
where
helloHandler :: Maybe Int -> Handler HelloMessage
helloHandler mAge =
let
sAge = case mAge of
Nothing -> "0"
Just ag -> show ag
in
return . HelloMessage $ sAge

app2 :: Application
app2 = serve appAPI2 myHandler

main :: IO ()
main = run 8080 app2

我可以访问/hello返回 { "msg" : 0}/hello?age=20返回 { "msg" : 20} 。但是如果我将年龄设置为可解析的非整数,例如"foobar"这使得 url 成为 /hello?age=foobar并访问它,它返回一条关于 "foobar" 上解析错误的错误消息.

这与 Capture 的行为不同如果我给予相同的处理,它只会返回 http 400。

我的代码有什么问题吗?

编辑:经过进一步探索,它确实在解析错误时返回 http 400。现在我改变一下问题。如果出现以下情况,如何返回自定义错误消息 会发生这种情况吗?

最佳答案

QueryParam 的默认行为是这样的:如果无法解码,则出错,但如果未指定,则返回 Nothing。

从servant 0.13开始,你可以覆盖这个。

如果你看the definition of QueryParam ,您可以看到它实际上只是更通用的 QueryParam' 类型的特例:

type QueryParam = QueryParam' '[Optional, Strict]

QueryParam' 采用我们所说的“修饰符”,它会影响两件事:

  • 是否可以在没有此参数值的情况下生存:如果可以,您的处理程序会得到一个 Maybe a,如果不是,您会直接得到一个 a 但会出错当没有给出值时。这是必需可选
  • 您是否希望解码失败是致命的:如果您这样做,那么当解码失败时,servant 会为您输出错误,否则您的处理程序会得到一个a。如果不这样做,那么您的处理程序会收到 Either Text a,然后您可以在出现解码错误时自由地执行任何操作(这是 Left 情况) Either,带有文本错误消息)。这是严格宽松

因此,您可能想要定义类似于 type MyQueryParam name a = QueryParam' '[Optional, Lenient] 的内容,并在适当的时候使用它。

这能解决您的问题吗?

关于haskell - Servant QueryParams 解析错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51146315/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com