【问题标题】:Should I use the "post/redirect/get" pattern in this case?在这种情况下我应该使用“发布/重定向/获取”模式吗?
【发布时间】:2011-04-08 11:12:35
【问题描述】:

在我们的网络应用程序中,我允许用户使用简单的单页表单(类似于 SO 中的个人资料)编辑他们的个人资料。

我正在尝试决定在这种情况下是否使用“发布/重定向/获取”模式。

  • 一方面,更新后,用户可以刷新个人资料页面(或使用后退按钮导航到该页面),而不会出现任何烦人的浏览器消息,询问他们是否希望重新提交数据。

  • 另一方面,此模式需要来自浏览器的第二次请求,并且还需要服务器获取配置文件实体两次(一次更新它,然后再次在重定向时显示它)。

  • 如果我们实现某种类型的数据库复制,还有一个问题是第二个请求可能会转到不同的服务器,该服务器可能没有收到对配置文件实体的更新。这个问题可以通过 Memcache 或类似的策略来解决,但它会增加更多的复杂性。

  • “发布/重定向/获取”也使显示确认消息(“您的配置文件更改已保存”)变得复杂,因为我们现在需要存储一个标志,提示消息显示在第二个要求。理想情况下,我们希望让我们的应用程序尽可能保持 RESTful。

解决这个问题的最佳方法是什么?还有其他我遗漏的注意事项吗?

【问题讨论】:

    标签: webforms post-redirect-get


    【解决方案1】:

    始终使用 Post-Redirect-Get。期间。

    另一方面,此模式需要来自浏览器的第二次请求,并且还需要服务器获取配置文件实体两次(一次更新它,然后再次在重定向时显示它)。

    很难衡量。

    如果我们实现某种类型的数据库复制...

    那就不要了。

    你很少需要这个。很少。几乎所有 Web 事务的瓶颈是从 Apache 下载到桌面。您的应用程序和数据库不是瓶颈。

    在您能够证明数据库确实是事务中最慢的部分之前,不要使用数据库复制。

    “发布/重定向/获取”也使显示确认消息变得复杂(“您的个人资料更改已保存”)

    这不是“旗帜”。它实际上是一个未显示消息的队列。您的 HTML 界面涉及会话,消息队列是会话对象的一个​​特征。 HTML 并不完全是 RESTful,因为——嗯——人们期待会话。

    纯 REST 版本在第一个 GET 中没有确认消息。

    【讨论】:

    • 谢谢!关于数据库复制,如果我们使用 Google App Engine 作为托管环境,我们可能无法控制这种行为,因为 Datastore 本质上是一个巨大的复制数据库,所以我们仍然需要处理这个问题。
    • @Jen:AFAIK,你不必“处理”它。他们为您处理缓存一致性。
    猜你喜欢
    • 2011-01-17
    • 2022-07-22
    • 1970-01-01
    • 2013-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-02
    相关资源
    最近更新 更多