forms - 带有页面流的 Yesod 表单

标签 forms rest haskell session-state yesod

某些表格太复杂,无法将它们放在一页上。例如,如果表单涉及大量结构化数据,例如在 map 上选择位置、在日历小部件中安排事件,或者根据之前的输入使表单的某些部分发生变化,那么能够将某个表单拆分为多个页面。

这对于动态网页和 Javascript 来说很容易做到,因为只需创建一个带有不同页面的选项卡小部件,实际提交的表单将包含整个选项卡小部件及其所有输入字段,生成单个 POST请求整个操作。

但是,有时生成某些输入字段需要很长时间;即使在页面生成之后,它们甚至可能是计算密集型的,对低端计算机用户的浏览器造成负担。此外,创建根据早期输入自行调整的表单变得困难或不可能。

因此,有必要将某个表单拆分为多个整页请求。

这可能很困难,尤其是因为表单的第一页将 POST/location/a , 这将重定向到 /location/b并要求为 GET由客户。从 POST /location/a 传递存储的表单数据至GET /location/b是困难所在。

Erwin Vervaet,Spring Web Flow(Spring 框架的一个子项目,以其依赖注入(inject)能力而闻名)的创建者曾经写过 a blog article在所述框架中演示此功能,并将其与实现 similar functionality 的 Lift Web 框架进行比较.然后他提出了对其他 Web 框架的挑战,这在 a later article 中有进一步的描述。 .

Yesod 将如何面对这个问题,尤其是考虑到它基于 REST 的无状态特性?

最佳答案

首先,目前还没有预先构建的解决方案(至少我知道)。而且我不熟悉提到的其他框架如何解决问题。所以我在这里说的几乎是猜想。但是,我相当肯定它会起作用。

这里问题的关键是将页面 A 的 POST 参数编码到页面 B 的 GET 请求中。最简单的方法是将页面 A 的 POST 参数粘贴到 session 变量中。但是,这样做会彻底破坏导航:后退/前进根本不会像描述的那样工作。

所以我们回到 REST:我们需要将 POST 参数编码到请求本身。这实际上意味着将信息放在请求的路径或查询字符串中。查询字符串可能是最有意义的。

我担心将原始 POST 参数放入查询字符串中,因为这将允许任何代理服务器轻松窥探内容。所以我想利用来自客户端 session 的现有密码学。换句话说,我们将在查询字符串参数中粘贴之前提交的表单的签名、加密版本。

为了使它更具体一点:

  • 用户通过 GET 转到页面 A。
  • 用户通过 POST 提交页面 A。
  • 服务器验证表单提交,获取一个值,序列化它,加密/散列它。
  • 用户被重定向到页面 B 作为 GET,查询字符串参数包含来自页面 A 的加密/散列值。
  • 根据需要多次继续此过程。
  • 在最后一页,您可以解密查询字符串参数并提交所有表单。

  • 如果有人感兴趣,这看起来将是一个有趣的附加包。

    关于forms - 带有页面流的 Yesod 表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11600037/

    相关文章:

    javascript - 需要 iFrame 外部的父按钮来调用 iFrame 内部加载的 JS 函数

    javascript - 用户名格式 : Comparing the input data in an array

    java - GWTP Rest Dispatch 可以与 REST Spring 服务器后端一起使用吗?

    java - 了解 Mule ESB 如何适应 JDBC 和 REST

    php - 多部分表单数据不允许撇号?

    html - 如何将两个表格彼此相邻放置在图像的中心

    c# - RestSharp 反序列化为 List<MyClass>

    haskell - 有用于文本的 Haskell readMaybe 函数吗?

    unit-testing - IO返回值测试

    Haskell 使用惰性 mmap 读取最后一行