Web applications 是否可以使用HTTP GET方法修改新闻稿确认/取消订阅邮件的DB?

Web applications 是否可以使用HTTP GET方法修改新闻稿确认/取消订阅邮件的DB?,web-applications,web,newsletter,Web Applications,Web,Newsletter,我正在实现一个web应用程序,让用户能够订阅“时事通讯”。用户只需要提供他们的电子邮件地址,没有注册页面。要确认电子邮件地址,系统将向给定地址发送电子邮件,并要求用户通过单击链接验证电子邮件地址。该链接向服务器发出GET请求,并在模型中修改一个标志,该标志表示用户的新闻稿从confirm=>false到confirm=>true。问题是我使用的GET请求修改了内部服务器状态,这是错误的。问题是,所有需要电子邮件确认的系统都遵循这种模式 有更好的方法吗?当用户在浏览器中进入确认页面时,我是否应该使

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

有更好的方法吗?当用户在浏览器中进入确认页面时,我是否应该使用Javascript触发Ajax POST请求

同样的情况也适用于退订


谢谢

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

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

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

不要担心。

我找到了一个关于这个问题的答案

它说的基本上是:

  • 如果某个链接请求更改内容,“web加速器”(我不确定它是否仍然是一个内容)可能会预取页面并在您甚至不触摸链接的情况下进行更改
  • 为了防止这种情况,只需使用GET请求实现一个页面,然后使用Javascript请求POST/PUT-To-alter。这样,web accelerator就不会启动任何东西,您实际上必须通过单击链接自己访问页面
  • 如果禁用了Javascript,请在页面中放置一个表单来执行POST/put

这听起来仍然有点粗略,因为POST/PUT请求不是来自用户的直接操作。但实际上,我们在请求Javascript中的所有内容,而且它们中的大多数都与用户的行为是间接的。

这就引出了一个问题——这是不是幂等的?如果是这样,那就好了。(我们无法从问题中分辨。)@David除了是幂等的外,GET一般不应该改变任何东西。。。当已知资源是以幂等方式时,通常最好使用PUT来修改资源。唯一有效的HTTP方法是HTTP GET,这是大多数电子邮件客户端的标准方法。在这种情况下,人们可能应该扔掉“这本书”,去买一些“刚好有效”的东西。@Ray:如果你从字面上理解,这意味着GET不应该被记录,因为这是一种改变。@DavidSchwartz日志记录不会创建或修改restful web服务公开的资源(通常)。如果你点击两次链接,您第二次获得的输出与第一次相同吗?或者你收到了某种你已经确认的信息?还是一个错误?我得到了相同的输出。你可以说它是幂等的