- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在这里阅读仆人教程:https://docs.servant.dev/en/stable/tutorial/Server.html#from-combinators-to-handler-arguments
其中大致有如下代码:
app1 :: Application
app1 = serve (Proxy :: Proxy API) server3
main' :: IO ()
main' = run 8081 app1
type API = "position" :> Capture "x" Int :> Capture "y" Int :> Get '[JSON] Position
:<|> "hello" :> QueryParam "name" String :> Get '[JSON] HelloMessage
:<|> "marketing" :> ReqBody '[JSON] ClientInfo :> Post '[JSON] Email
data Position = Position
{ xCoord :: Int
, yCoord :: Int
} deriving Generic
instance ToJSON Position
newtype HelloMessage = HelloMessage { msg :: String }
deriving Generic
instance ToJSON HelloMessage
data ClientInfo = ClientInfo
{ clientName :: String
, clientEmail :: String
, clientAge :: Int
, clientInterestedIn :: [String]
} deriving Generic
instance FromJSON ClientInfo
instance ToJSON ClientInfo
data Email = Email
{ from :: String
, to :: String
, subject :: String
, body :: String
} deriving Generic
instance ToJSON Email
emailForClient :: ClientInfo -> Email
emailForClient c = Email from' to' subject' body'
where from' = "great@company.com"
to' = clientEmail c
subject' = "Hey " ++ clientName c ++ ", we miss you!"
body' = "Hi " ++ clientName c ++ ",\n\n"
++ "Since you've recently turned " ++ show (clientAge c)
++ ", have you checked out our latest "
++ intercalate ", " (clientInterestedIn c)
++ " products? Give us a visit!"
server3 :: Server API
server3 = position
:<|> hello
:<|> marketing
where position :: Int -> Int -> Handler Position
position x y = return (Position x y)
hello :: Maybe String -> Handler HelloMessage
hello mname = return . HelloMessage $ case mname of
Nothing -> "Hello, anonymous coward"
Just n -> "Hello, " ++ n
marketing :: ClientInfo -> Handler Email
marketing clientinfo = return (emailForClient clientinfo)
curl http://localhost:8081/position/1/2
{"yCoord":2,"xCoord":1}
2
替换
test
:
curl -v http://localhost:8081/position/1/test
* Trying ::1:8081...
* TCP_NODELAY set
* connect to ::1 port 8081 failed: Connection refused
* Trying 127.0.0.1:8081...
* TCP_NODELAY set
* Connected to localhost (127.0.0.1) port 8081 (#0)
> GET /position/1/test HTTP/1.1
> Host: localhost:8081
> User-Agent: curl/7.65.3
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 400 Bad Request
< Transfer-Encoding: chunked
< Date: Mon, 16 Dec 2019 18:01:00 GMT
< Server: Warp/3.2.28
<
* Connection #0 to host localhost left intact
ExceptT
有关吗?功能?任何地方都有这样的简单例子吗?
最佳答案
总的来说,我认为,这是不值得做的,因为一般来说,可能会有非常复杂的路由组合,产生非常不直观的错误信息。例如,考虑以下 API:
type API =
"position" :> Capture "x" Int :> Capture "y" Int :> Get '[JSON] Position
:<|> "position" :> "foo" :> "test" :> Get '[JSON] Position
/position/1/2
和
/position/foo/test
,但拒绝
/position/1/test
,并且您无法为最后一种情况生成合理的错误消息。它必须类似于“在最后期望一个 Int,或者在第二个从端位置期望一个“foo”,但在最后得到“test”,在第二个从端得到“1”” .对消费者没有帮助。
type API = "position" :> Capture "x" Int :> Capture "y" Int :> Get '[JSON] Position
:<|> "position" :> Capture "x" Text :> Capture "y" Text :> Get '[JSON] ()
:<|> "hello" :> QueryParam "name" String :> Get '[JSON] HelloMessage
:<|> "marketing" :> ReqBody '[JSON] ClientInfo :> Post '[JSON] Email
...
server3 = position
:<|> badPosition
:<|> hello
:<|> marketing
where
...
badPosition x y =
throwError $ err400 { errBody = "Expected ints, got '" <> x <> "' and '" <> y <> "'" }
关于haskell - 如何使用 Servant 验证/报告无效输入的错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59362437/
我正在浏览找到的仆人教程 here .有一个部分实现留给用户弄清楚它应该是什么。 type APIFor a i = Get '[JSON] [a] : ReqBody '[JSON
我正在尝试向我的 servant 服务器添加一项功能,该功能将从 Amazon S3 获取文件并将其流式传输回用户。由于文件可能很大,我不想将它们下载到本地然后将它们提供给客户端,我宁愿将它们直接从
我正在尝试使用 Servant 在 Haskell 中构建 Web 服务器,其中部分 API 作为另一个 API 的反向代理。 I found an example 如何实现这一点。但是好像不行: t
我正在关注 the Servant tutorial ,并且我定义了以下 API 类型: type UsersAPI = "users" :> QueryParam "sortby" SortBy :
任何人都可以向我提供一个带有servant-server、wai、warp 等的cookie 的最小示例吗? 例如,具有单个字段“语言”且值为“en”的 Cookie 有没有像 happstack-l
给出以下代码: newtype HelloMessage = HelloMessage { msg :: String } deriving (Generic) instance ToJSON H
我正在使用自定义 monad(带有读取器)轻松地将数据库池等数据传递给我的处理程序(在使用自定义 monad 之前,我曾经将连接作为 fn 参数传递)。 这就是我定义自定义 monad 的方式: ne
我正在这里阅读仆人教程:https://docs.servant.dev/en/stable/tutorial/Server.html#from-combinators-to-handler-argu
我正在尝试按照官方 servant tutorial 使用仆人和松散堆栈来设置基本项目和 stack guide 。一旦我添加 import Servant 堆栈构建就会失败: Could not f
给定以下 Servant 服务器: {-# LANGUAGE DataKinds #-} {-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE TypeOpera
使用 servant 时,我想以 JSON 格式返回所有错误。目前,如果请求无法解析,我会看到这样的错误消息,以纯文本形式返回 Failed reading: not a valid json val
我已经使用 Haskell 一年左右了,它太棒了。我最近开始使用Servant;我想使用 SQL 库,例如 Selda,这样一切都是类型安全的。 (当与 Elm 结合时,这真是令人难以置信!:)) 这
默认情况下,即使请求的端点返回 JSON,Servant 也会返回纯字符串请求 $ http $S/signup email=mail@domain.com HTTP/1.1 400 Bad Requ
我有一个仆人应用程序,并针对我的问题查看了以下问题,我收到了 400 个带有 OPTIONS 动词的预检请求: https://github.com/haskell-servant/servant/i
我正在尝试使用 telegram-api 构建一个 Telegram 机器人。到目前为止,我还没有遇到任何问题,因为我可以阅读测试来了解事情是如何工作的,但在使用 Servant 构建 webhook
我有一个带有 rest api 的简单服务应用程序: type API = "items" :> Get '[JSON] [MyData] app :: Application app = serve
我试图了解 Servant 的 serveWithContext 函数的用途。文档指出它不是 ReaderT Monad 的替代品,但我不确定它试图解决 ReaderT 尚未解决的问题。 例如,这是来
我正在尝试将 Servant 身份验证(servant-auth-server 包)与 RIO 作为我的处理程序 monad 结合使用,以避免出现 exceptT 反模式。但是,我无法正确排列类型以处
servant paper简介包含以下示例 API 类型: type Echo = "echo" :> ReqBody ’[PlainText] String
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 7 年前。 Improv
我是一名优秀的程序员,十分优秀!