【问题标题】:Is it ok to use HTTP GET method that modifies the DB for newsletter confirmation/unsubscribe mails?是否可以使用 HTTP GET 方法修改数据库以进行通讯确认/取消订阅邮件?
【发布时间】:2013-01-01 12:33:31
【问题描述】:

我正在实现一个网络应用程序,让用户能够订阅“时事通讯”。用户只需要提供他们的电子邮件地址,没有注册页面。为了确认电子邮件地址,系统会向给定地址发送一封电子邮件,并要求用户通过单击链接来验证电子邮件地址。该链接向服务器发出 GET 请求,并将模型中表示用户时事通讯的标志从已确认 => false 修改为已确认 => true。问题是我正在使用修改内部服务器状态的 GET 请求,这很糟糕。问题是所有需要电子邮件确认的系统都遵循这种模式。

有没有更好的方法来做到这一点?当用户在他的浏览器中进入确认页面时,我应该使用 Javascript 来触发 Ajax POST 请求吗?

同样适用于退订。

谢谢!

【问题讨论】:

  • 如果你点击链接两次,你第二次得到的输出和第一次一样吗?或者您是否收到某种您已经确认的消息?还是错误?
  • 我得到相同的输出。可以说是幂等的

标签: web-applications web newsletter


【解决方案1】:

我找到了一个关于这个问题的interesting article

它基本上是这样说的:

  • 如果链接请求更改内容,“网络加速器”(我不确定它是否仍然存在)可能会预先获取页面并进行更改您甚至无需触摸链接强>。
  • 为防止这种情况发生,只需实现一个带有 GET 请求的页面,然后使用 Javascript 请求 POST/PUT 进行更改。这样,网络加速器不会触发任何内容,您实际上必须通过单击链接自行访问该页面。
  • 如果禁用了 Javascript,请在​​执行 POST/PUT 的页面中放置一个表单。

这听起来有点粗略,因为 POST/PUT 请求并非来自用户的直接操作。但实际上我们是在请求 Javascript 中的所有东西,而且其中大多数都与用户的行为无关。

【讨论】:

    【解决方案2】:

    StackOverflow(好吧,StackExchange)在他们的订阅确认电子邮件中使用 HTTP GET。这不是一件坏事。事实上,我在收件箱/存档中找不到任何相反的网站实例。

    https://stackexchange.com/filters/email-confirm/999999

    别着急。

    【讨论】:

      【解决方案3】:

      您不应该对任何非幂等的事物使用 GET 请求。使用 POST 首次订阅并更改现有订阅记录。从技术上讲,您可以使用 PUT 更改现有记录,但您需要知道该记录已经存在,因此始终使用 POST 会更容易。

      严格来说,您可以使用 GET 链接预填充一个表单,您可以使用 JS 或用户可以在页面上按下的确认提交按钮来触发对您的服务的 POST 请求。

      【讨论】:

      • 这会导致问题——这是否是幂等的?如果是这样,那很好。 (我们无法从问题中看出。)
      • @David 除了是幂等的,GET 通常不应该改变任何东西......通常最好使用 PUT 来修改已知为幂等的资源
      • 唯一可以正常工作的 HTTP 方法(大多数电子邮件客户端的标准)是 HTTP GET。在这种情况下,人们可能应该扔掉“书”,而去寻找“行之有效”的东西。
      • @Ray:如果你从字面上理解,这意味着不应该记录 GET,因为这是一种改变。
      • @DavidSchwartz 日志记录不会创建或修改由 RESTful Web 服务公开的资源(通常)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-24
      • 2014-06-15
      • 1970-01-01
      • 2021-12-05
      • 1970-01-01
      • 1970-01-01
      • 2016-10-31
      相关资源
      最近更新 更多