2

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

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

同样适用于取消订阅。

谢谢!

4

3 回答 3

1

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

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

于 2013-01-17T21:05:37.343 回答
0

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

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

别担心。

于 2013-01-17T21:16:19.167 回答
0

我发现了一篇关于这个问题的有趣文章。

它说的基本上是:

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

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

于 2021-05-25T19:57:32.423 回答