仆人的重定向

时间:2017-10-17 11:38:29

标签: haskell servant

使Servant处理程序响应重定向的适当方法是什么?我正在使用导航REST应用程序,我想响应POST请求,这些请求通过重定向到相应的GET资源列表路径来创建资源。因此,例如 POST / foos 应该在创建foo后重定向到 GET / foos 。我在文档中找不到明确的方法。

1 个答案:

答案 0 :(得分:8)

有一个简单(但有点hacky)的答案,以及使第一个选项过时的主角(编辑:实际上是第三个,更好的选项)。

目前的典型解决方案是简单地使用Handler monad具有MonadError ServantErr实例的事实,并且ServantErr是一种非常通用的“响应类型”,它确实可以描述应用程序错误的HTTP响应,但实际上也是重定向或许多其他事情。所以你可以做throwError $ err301 { errHeaders = [("Location", "https://haskell.org/")] }之类的事情。这很难看,因为我们劫持了一些成功工作流程的“错误输出”。但它有效,并且是一行代码。

我已经探索了其他方法,让您可以将类型安全的链接与重定向混合,以轻松地重定向到应用的其他端点/页面。现在已经过时了,但可能没有太多麻烦。

在看到这个问题后,我刚才想到了第三种选择。花了一些时间来试验它,看起来像是有效的!您可以在this gist中查看代码并使用它的示例。如果您有任何疑问,请告诉我。我们可能想要将一些内容添加到servant中。如果您觉得这个问题足够好,请随意在问题跟踪器上提出来。这种方法的要点是定义一个具有正确形状的自定义PostRedirect(没有响应主体,具有您选择的类型的Location头,并且您希望重定向使用的状态代码进行参数化),还有一个在返回之前适当包裹位置的小功能。