使用“ GET”作为在REST API中更改数据的方法是否正确

时间:2019-04-02 13:58:39

标签: php rest api logic

我正在创建一个用于双重选择目的的小型应用程序,用户必须单击电子邮件中的链接,但这会将GET HTTP请求发送到我的REST API。但是从逻辑上使用GET请求REST API会导致获取数据,而不是设置数据。

我尝试使用

<form method="post" action="x.x.x.x/api/optin/double/"></form> 

将方法设置为POST并创建输入元素的元素:

<input name="method" value="put" style="display:none">

通过参数“设置方法”。 但这似乎不是正确的解决方案。

我可以为此目的创建一个文件(“ accepteddooubleoptin.php”),但是我不确定这是否是正确的解决方案。还是我完全想念REST的目的?

3 个答案:

答案 0 :(得分:1)

  1. POST请求的电子邮件结果中没有链接的实用方法。最好的办法是将他们发送到一个页面,该页面显示一个他们必须单击的按钮,该按钮会生成POST请求,但是是否希望用户进行这种处理(而不是在他们的电子邮件中单击一下)仍是有争议的

  2. 请求基本上是幂等,即,即使用户单击多次,它仍然会导致他们只是处于选择状态,因此没有状态重复进行了修改(例如,与您每次POST/blog/posts时都会生成一个新帖子相反)。

最后,没关系,只需使用GET请求即可。

答案 1 :(得分:1)

GET是完成您要完成的工作的一种完全可接受的方法。

想用最真实的意思来使用GET / POST / PATCH / DELETE动词不是不好的本能,但这是一种情况,技术(即现代电子邮件客户端)几乎可以为您做出决定。没什么问题。

请参阅此short post from Campaign Monitor解释您尝试在电子邮件中生成POST请求时的外观。简而言之,用户的电子邮件客户端充其量是最好的

实际上,如果您查看来自任何流行的Web服务(例如,甚至是StackOverflow)的帐户验证或密码重置电子邮件,就会发现自己是一个很好的伙伴,因为它们使用带有查询字符串的链接来传递令牌或帐户标识符,以使用户进入其网站上正确的工作流程。

如果您仍然对通过GET“设置”值的想法感到不满意,您可能会认为它更像您的用户单击其链接以“获取”他们最终通过“设置”他们的偏好。

答案 2 :(得分:1)

  

使用“ GET”作为在REST API中更改数据的方法是否正确

要了解GET的标准含义,重要的一点是它具有safe语义。这是菲尔德(Fielding)描述问题in 2002的方式。

  

HTTP不会尝试要求GET的结果是安全的。该操作要求操作的语义是安全的,因此,如果发生任何导致财产损失的结果(钱,BTW,为了这个定义,它被视为财产。)

由于请求的语义被认为是安全的,因此允许电子邮件客户端在收件人单击链接之前发送请求!例如,客户端可以主动将响应加载到缓存中,这样,如果确实单击了链接,则可以减少人的等待时间。

对于“选择加入”之类的用例,您确实需要考虑如果在未经人类明确同意的情况下获取该链接将产生什么责任。

正确的方法是使用不安全的请求(如POST)。

但是,以“正确”的方式实施Opt可能会对您的接受率产生重大影响;企业可能更愿意承担责任而不是失去机会。