仆人中的重定向

Redirections in Servant

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

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

当前典型的解决方案是简单地使用 Handler monad 有一个 MonadError ServantErr 实例,并且 ServantErr 是一个非常通用的 "response type"它确实可以描述应用程序错误的 HTTP 响应,但也可以描述重定向或许多其他内容。所以你可以做类似 throwError $ err301 { errHeaders = [("Location", "https://haskell.org/")] } 的事情。这很丑陋,因为我们劫持了 "erroring out" 位以实现某些成功的工作流程。但它有效,而且是一行代码。

我探索了替代方法,让您可以将 type-safe 链接与重定向混合使用,从而轻松重定向到您应用的其他 endpoints/pages。这现在已经过时了,但很可能可以在没有太多麻烦的情况下工作。

看到这个问题,我刚刚想到了第三种选择。花了一些时间来试验它,看起来它有效!您可以在 this gist 中查看带有使用示例的代码。如果您有任何问题,请告诉我。我们可能想将其中的一些添加到 servant 中。如果您认为这足够好,请随时在问题跟踪器上提出它。这种方法的要点是定义一个具有正确形状的自定义 PostRedirect(没有响应 body,一个具有您选择的类型的位置 header,并由状态代码参数化您希望使用重定向),以及一个在返回之前适当包装位置的小函数。