11

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

4

1 回答 1

14

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

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

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

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

于 2017-10-17T12:11:14.907 回答