是否可以使用HTTP GET方法修改数据库以进行通讯确认/取消订阅邮件?

时间:2013-01-17 21:04:20

标签: web-applications web newsletter

我正在实施一个网络应用,让用户可以订阅“简报”。用户只需提供自己的电子邮件地址,就没有注册页面。要确认电子邮件地址,系统会向指定地址发送电子邮件,并要求用户通过单击链接验证电子邮件地址。该链接向服务器发出GET请求,并修改模型中的一个标志,该标志代表来自confirm =>的用户简报。 false to confirmed =>真正。问题是我正在使用GET请求来修改内部服务器状态,这很糟糕。问题是所有需要电子邮件确认的系统都遵循这种模式。

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

同样适用于取消订阅。

谢谢!

3 个答案:

答案 0 :(得分:0)

您不应该对非幂等的任何内容使用GET请求。使用POST首次订阅并更改现有订阅记录。从技术上讲,你可以使用PUT来改变现有的记录,但是你需要知道记录已经存在,所以总是使用POST更容易。

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

答案 1 :(得分:0)

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

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

不要担心。

答案 2 :(得分:0)

我发现了一个关于此问题的 interesting article

它的主要内容是:

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

这听起来仍然有点粗略,因为 POST/PUT 请求不是来自用户的直接操作。但实际上,我们在 Javascript 中请求了所有类型的东西,而且其中大部分都是间接影响用户行为的。