问题标签 [servant]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
253 浏览

haskell - 仆人处理程序中的任一计算

servant-server Handler是一个新类型的包装器,具有, ,等ExceptT的实例。MonadThrowMonadCatchMonadError

这可能是一个有点做作的例子,但它显示了我经常面临的一个问题:

在处理程序中,我想调用三个返回的函数Either String Int,然后执行 type 的计算,从之前Int -> Int -> Int -> IO (Either SomeError Text)获取三个Ints。

我应该如何构建此代码以确保尽早返回错误?

我看到我可以使用Either'Monad实例将前三个Either String Int计算“折叠”到 egEither String (Int,Int,Int)中,然后将IO计算绑定到某个结果值,然后使用case来决定是返回成功结果还是使用throwError抛出SomeError类型(在转换后?),但我希望能够做到以下几点:

是否可以编写类似于上面的代码?

0 投票
1 回答
355 浏览

haskell - 使用 nginx 在 https 上运行 Haskell 仆人

我试图弄清楚如何使用 nginx 通过 https 正确运行 Servant API 端点。

所以要经历我所做的。所以我想我可能需要设置 Servant,以便它可以通过 https 进行通信。所以我将此添加到我的代码中

所以这里的生产子句是在我的生产服务器上运行的。然后我在nginx中有这个

通过此设置,我从页面(通过 https 正确运行)执行 ajax 请求。但是,当我这样做时,我会收到来自仆人服务器的响应

好像我的 ajax 请求不安全。我相信,如果我从带有 https 的页面发出 ajax 请求,那么该请求是安全的。

如果我跳过所有这些并在没有 TLS 的情况下运行 Servant,我会在尝试发布时收到 405 Method Not Allowed。我知道这已连接到 https,因为当我直接向 API 的 IP:PORT 执行请求时,它可以工作。这里可能是什么问题?

0 投票
1 回答
531 浏览

haskell - :~> 运算符在haskell中做了什么

我正在浏览一个似乎是使用 haskell 和 elm 的网站的 github 项目。它:~> 在此文件的类型签名中使用运算符。我找不到该运算符的定义。

它有什么作用?我为什么要使用它?这叫什么?

0 投票
3 回答
294 浏览

haskell - IO 操作是否可以在将逻辑保持在纯函数中的同时进行排序?

我有以下代码从分页 API 端点获取两页数据。我想修改query函数以继续获取页面,直到它找不到更多数据(因此take 2在下面的代码中替换为查看 API 响应的内容)。

我的问题是是否可以在不将query功能更改为功能的情况下实现这一目标IO。如果是这样,我将如何去做。如果没有,有没有办法在不编写递归函数的情况下做到这一点?

这是代码:


我试图用它takeWhileM来做到这一点,最终使查询成为一个IO函数并传递url给它。它开始看起来很糟糕,我无法匹配类型(我觉得我需要更像(a -> m Bool) -> m [a] -> m [a]而不是(a -> m Bool) -> [a] -> m [a]什么东西takeWhileM- 仍然觉得这很奇怪,因为我将此功能视为过滤器,但输入list 和 output list 是不同的(一个有 monad,另一个没有)。

0 投票
0 回答
91 浏览

haskell - 在servant中路由

我在 Haskell 项目中使用仆人。下面是我的源代码:

对于每个方法(pageH1、pageH2、pageH3)都有一个通用操作。此通用操作确定是否可以加载页面(pageH1、pageH2、pageH3)。我想为路径“base/”编写一个侦听器,然后在下一条路线上移动(或不移动)。像下一个:

是否可以实施?

0 投票
1 回答
57 浏览

haskell - 已经实现的“没有实例”特征

我想将 Servant 的ClientMmonad 与 一起使用,但遇到了错误。finally:: MonadBaseControl IO m => m a -> m b -> m aNo instance for (MonadBaseControl IO ClientM)

奇怪的是,这个确切的实例似乎已经定义了,无论是来自内部模块。

我是否需要以某种方式显式导入此类实例?

0 投票
1 回答
775 浏览

json - Haskell Servant 自定义 JSON 解析错误

给定以下仆人服务器:

...以及以下 curl 到上述服务器的运行实例:

我回来了:

有没有办法拦截 Aeson 错误并将其替换为不会将实现细节泄漏给客户端的东西?据我所知,这一切都发生在 Servant 机器的幕后,我找不到任何关于如何连接它的文档。

例如,我很想返回类似的东西:

谢谢!

0 投票
1 回答
564 浏览

haskell - Haskell Servant:使用任意请求数据获取请求

我正在使用 Servant 提供 API,全部由 Snap 管理。在 Servant 中,很容易在 POST 请求中包含任意数据类型,假设它有一个FromJSON实例。例如,我可能有以下端点:

我如何为 GET 请求做同样的事情?据我了解,我需要使用查询参数,但我的请求数据由复杂的数据类型(列表、嵌套字典)组成,这些数据类型似乎不容易读取,例如QueryParam "vals" [Int] :> Post '[JSON] [Int]导致错误No instance for (FromHttpApiData [Int])

一种解决方法是使用具有易于阅读的请求正文的 POST 请求。但是,这会与我在 Nginx 中的缓存方案发生冲突,因为对 POST 请求的响应不是那么容易缓存的。即使我可以缓存它们,我也不想缓存所有发布请求,所以这将是一种混乱的方法。

谢谢你的帮助!

0 投票
1 回答
398 浏览

haskell - Servant QueryParams 解析错误

给定以下代码:

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

如果我给予相同的处理,它的行为会有所不同,Capture它只会返回一个 http 400。

我的代码有什么问题?

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

0 投票
1 回答
132 浏览

haskell - 减少 Haskell Servant 中的重复

我正在进行的项目涉及调用 CloudFlare API。我已经使用 Servant(客户端)定义了 API,并且可以从中创建一个客户端。但是,CloudFlare API 需要身份验证标头,因此我的所有 API 类型最终都会重复。有没有办法在类型级别摆脱那些?我对客户端派生函数需要这些参数感到满意。

示例代码: