【问题标题】:Redirections in Servant仆人中的重定向
【发布时间】:2017-10-17 11:38:28
【问题描述】:

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

【问题讨论】:

  • 就个人而言,我认为这不是一个好习惯。 POST 本身应该返回数据(由服务器填写的 id 等)。否则你会无缘无故地强制客户端再做一个 HTTP 请求。
  • 如果我这样做,如果我在提交表单并且创建操作返回新的 html 内容后单击刷新,浏览器将显示有关表单重新发送的警报。
  • 啊,是的,我知道这对于基于表单的 HTML API 有什么意义……我在想 JSON。

标签: haskell servant


【解决方案1】:

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

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

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

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

【讨论】:

  • 谢谢!我认为这将是对 Servant 的一个很好的补充。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-11
  • 2015-09-19
  • 1970-01-01
  • 1970-01-01
  • 2016-08-29
  • 1970-01-01
相关资源
最近更新 更多