2016-09-25 62 views
8

当用户注册我的Web应用程序时,我会发送一封电子邮件来验证他的收件箱。 在电子邮件中有一个资源的链接是这样的:什么是验证电子邮件的REST方式?

GET /verify/{token} 

由于资源在幕后被更新,不打破它的RESTful方法?

我该如何以REST风格进行操作?

+0

不在幕后添加任何东西吗?你会给他们一个表格发布来改变它?这将是后和更新密码,令牌只是让他们正确地看到形式。 –

+0

在幕后我在数据库中搜索什么用户有这个令牌,并设置字段为NULL考虑有效的用户的电子邮件。 – user3482682

+0

只需要一个表单(不要触摸数据库),然后张贴到自己并使用获取参数+获取参数并将其发布到数据库,然后做更新。如果用户点击了URL,你不想让他们再次击中它,如果他们需要回来打击肯定? –

回答

0

难道你不是在追求REST吗?通过电子邮件验证,您希望用户只需点击他使用的任何邮件用户代理的链接,就可以在服务器上获得简单的GET(作为超链接呈现给用户)无论是在路径或作为查询字符串的一部分的令牌:

GET http://example.com/verify-email/TOKEN 
GET http://example.com/verify-email?token=TOKEN 

要么是细用于该用途的情况。这不是一个真正的资源,你正在获得或创建;只是后端某个进程的触发器。

为什么你认为这会违反良好的设计?

+0

我认为这会运行良好的设计afol,因为在REST URI中不应该是一个动词(在这种情况下验证)。 – user3482682

0

这取决于你想要做什么。

是否在验证用户后触发电子邮件例如?如果是这样,它不是一个幂等方法,你应该使用POST。

例子:

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

如果这个方法不具有除了更新的任何后果,我认为你应该使用PUT。

+0

如果意图是用户可以单击收到的电子邮件中的超链接,除非您开始包含表单标签,否则POST和PUT是不可能的。如果用户以纯文本的形式查看电子邮件,这将不起作用。 – JeroenHoek

+0

REST API和这种集成之间的任何通信都需要一个用于交互的网站。电子邮件上的超链接需要将用户发送到网站,而不是API。该网站将得到GET/something?token = blabla并将其发送到REST API –

4

你说的是不是REST。 REST用于机器对机器的通信,而不是用于人机对话的通信。您可以开发第一方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服务中获得的超链接验证和发送POST到服务后的背景。

# 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客户端,然后将HTTP请求发送到REST服务将完全在服务器上运行,你不会看到任何关于它在浏览器中。如果你有一个客户端REST客户端,那么你可以使用AJAX CORS在浏览器中发送POST,或者你可以尝试直接使用HTML表单进行POST(不推荐)。无论如何,激活应该是一个POST或PUT。

+0

我同意你关于激活应该是POST或PUT。但以我没有经验的观点,我认为在REST URI中不应该是一个动词(在这种情况下进行验证),但另一方面,doens不存在VERIFY HTTP请求。 – user3482682

+0

@ user3482682只有客户端的URI包含“验证”动词。服务的URI包含“验证”,这是一个名词。您的主要问题是您将浏览器与REST客户端混淆。浏览器不是REST客户端,它只是一个HTTP客户端。 – inf3rno

+0

谢谢inf3rno您的建议,我标记你的答案是有用的。 – user3482682