Rest 什么';剩下的验证电子邮件的方法是什么?

Rest 什么';剩下的验证电子邮件的方法是什么?,rest,email-validation,Rest,Email Validation,当用户注册到我的web应用程序时,我会发送一封电子邮件来验证他的收件箱。 在电子邮件中,有一个指向以下资源的链接: GET /verify/{token} 由于资源是在幕后更新的,它不是破坏了RESTful方法吗 我怎样才能以平静的方式做这件事呢?你不是想得太多了吗?通过电子邮件验证,您希望用户能够简单地单击他正在使用的任何邮件用户代理的链接,这样您就可以在服务器上进行简单的访问(显示为用户的超链接),并在路径中或作为查询字符串的一部分使用令牌: GET http://example.com/

当用户注册到我的web应用程序时,我会发送一封电子邮件来验证他的收件箱。 在电子邮件中,有一个指向以下资源的链接:

GET /verify/{token}
由于资源是在幕后更新的,它不是破坏了RESTful方法吗


我怎样才能以平静的方式做这件事呢?

你不是想得太多了吗?通过电子邮件验证,您希望用户能够简单地单击他正在使用的任何邮件用户代理的链接,这样您就可以在服务器上进行简单的访问(显示为用户的超链接),并在路径中或作为查询字符串的一部分使用令牌:

GET http://example.com/verify-email/TOKEN
GET http://example.com/verify-email?token=TOKEN
对于这个用例,两者都可以。它不是你真正获得或创造的资源;只是后端某个进程的触发器


为什么你认为这会与好的设计相抵触?

这取决于你想做什么

例如,它是否会在验证用户后发送电子邮件?如果是这样,它不是幂等方法,您应该使用POST

例如:

POST /users/{id}/verify/{token}

如果这个方法除了更新之外没有任何结果,我想你应该使用PUT。

你说的不是REST。REST用于机器之间的通信,而不是人与机器之间的通信。您可以开发第1方REST客户端,它将激活发送到REST服务

您可以在浏览器中使用验证URI访问REST客户端:

# user follows a hyperlink in the browser manually

GET example.com/client/v1/verify/{token}
# asking the client to verify the token
然后,REST客户端将从REST服务获取用于验证的超链接,并在后台将帖子发送到该服务

# the REST client follows the hyperlinks given by the service automatically
# the REST client can run either on the HTTP client or server side

GET example.com/api/v1
# getting the starting page of the REST service
# getting the hyperlink for verification

POST example.com/api/v1/verification {token}
# following the verification hyperlink

如果您有一个服务器端第一方REST客户端,那么对REST服务的HTTP请求将完全在服务器上运行,并且您在浏览器中看不到有关它的任何内容。如果您有一个客户端REST客户端,那么您可以使用AJAX CORS在浏览器中发送帖子,也可以尝试使用HTML表单直接发布帖子(不推荐)。无论如何,激活应该是POST或PUT。

不会在幕后添加任何内容吗?你会给他们一张表格,让他们张贴来更改它吗?这将是发布和更新密码,令牌只允许他们正确查看表单。在后台,我在DB中搜索哪个用户有此令牌,并将字段设置为NULL,以考虑该用户的电子邮件是否有效。只需访问表单(不要触摸DB)然后发布到self并使用getparam+getparam并将其发布到DB,然后进行更新。如果用户点击了URL,你不想让他们再次点击,如果他们需要再次点击的话?如果目的是让用户可以点击收到的电子邮件中的超链接,那么POST和PUT是不可能的,除非你开始包括表单标签;如果用户以纯文本的形式查看电子邮件,这将不起作用。REST API和这种集成之间的任何通信都需要一个网站进行交互。电子邮件上的超链接需要将用户发送到网站,而不是API。该网站将获得一个get/something?token=blablabla并将其发送给其他API。我同意您的看法,激活应该是POST或PUT。但在我缺乏经验的观点中,我认为REST URI中不应该是动词(在本例中为verify),但另一方面,不存在verify HTTP请求。@user3482682只有客户端的URI包含“verify”动词。服务的URI包含“verification”,这是一个名词。这里的主要问题是将浏览器与REST客户端混淆。浏览器不是REST客户端,它只是一个HTTP客户端。谢谢你的建议。我将你的答案标记为有用。不过,web是REST的最佳示例,但主要是html超媒体。@andho REST是关于机器通信,而不是关于人机交互,所以这不是真的。我认为这是一个很好的设计,因为在REST URI中不应该是动词(在本例中验证)。使用GET的确认链接可能会导致问题,因为它们可能会通过预取等方式自动确认。看@Alex是对的,原因很清楚。这篇文章可以追溯到2006年,但仍然有效。