仆人的重定向

Jes*_*spc 9 haskell servant

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

Alp*_*ari 8

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

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

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

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