【问题标题】:Implement voting using REST使用 REST 实现投票
【发布时间】:2012-11-02 20:08:49
【问题描述】:

我正在开发我的第一个 Web 应用程序并且有这个基本的疑问。

我有一组帖子,我希望允许用户对其进行投票。我正在使用 PHP,所以我有一个 article.php 脚本,其中包含处理 HTTP 请求的代码。

目前,我实现了使用通过 POST HTTP 请求(使用 html 表单)发送的数据的文章创建。返回的文章 id 是我从存储文章的数据库中得到的。

同样,我处理 GET 请求并根据作为参数发送的 id 返回一篇文章。如果没有定义参数,我返回所有文章的列表。

目前我还没有进行任何 url 重写,所以请求的格式为 article.php?id=xxx

现在我想实施投票,这就是我面临的问题。根据 REST,我应该在特定资源上使用 POST(鉴于投票不是幂等的),因此我会向 /article/1234 发送一个带有正文 "+1" 的 POST 请求以获得赞成票。

问题是,如何将上述内容映射到我的用例?假设进行了 url 重写,那将转化为什么?对article.php?id=1234 进行重写是行不通的,因为 POST 不接受 URI (AFAIK) 中的参数。

另外,我如何将这个动作与其他动作区分开来?我是否还应该添加一些“动作”参数,例如article.php?id=1234&action=vote

【问题讨论】:

  • 重写不保留POST正文吗?
  • 确实如此,但是如何将 url 中的数据(在本例中为文章 ID)传递到 POST 正文中?
  • 您只需从$_GET['id'] 获取id 并从file_get_contents('php://input') 获取正文,因为它不是url 编码的。
  • @enenen 是否使用 Ajax 与问题无关。
  • 使用 GET 会破坏 REST 的目的。

标签: php web-services rest web-applications


【解决方案1】:

似乎没有真正了解 REST-ful 应用程序。使用 GET 检索文章并使用 POST 对其进行编辑很好,但是您必须将其扩展到投票。 REST-ful 应用程序假设一个 url 标识一个资源。因此,您必须将投票视为自己的资源(与文章相关)。 因此,您的应用程序应该像这样工作

GET article.php/id/1:检索 id 为 1 的文章

POST article.php/id/1:修改 id 为 1 的文章

GET article.php/id/1/votes:检索id为1的文章的投票

POST article.php/id/1/votes:更改 id 为 1 的文章的投票

只要将投票实现为一个简单的计数器,就可以通过添加一个赞成票来实现后一个。 您可以通过赋予投票身份来重新定义此逻辑,例如如果您想像投票的用户一样为投票添加更多属性。

正如您要求重写以及应用程序是否能够通过后请求从 url 获取数据:是的,这完全有可能。对 article?id=1 的 POST 请求将有 $_GET['id'] 可用。

如上所示的重写部分是完全可选的。 REST 对 url 的“漂亮”不感兴趣,只要一个 url 标识一个资源。

希望这能让您了解如何继续

【讨论】:

  • 啊哈!我可以在 POST 请求中使用参数的事实是我缺少的一点。我认为部分错误是在 POST 请求中使用 $_GET 时缺乏明确性。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多