Agavi PHP MVC框架是否使用CRUD符合REST的标准?

3
Agavi框架使用PUT请求来创建数据,使用POST请求来更新数据。通常在REST中,这个过程是反过来的(POST用于添加信息,PUT用于替换整个数据记录)。
如果我理解正确,重要的问题是PUT必须具有幂等性,而POST没有此要求。因此,我想知道如何保证创建新记录的幂等性(即多个请求不会导致多次创建记录),特别是当ORM使用ID作为主键时,新记录的ID不会被客户端知道(因为它是在数据库中自动创建的),因此不能成为请求的一部分。在这种情况下,Agavi如何保持PUT请求的幂等性要求。
谢谢。
4个回答

5
PUT 方法既可以用于创建完整记录,也可以用于更新完整记录。POST 方法通常用于部分更新和相关操作,以及在没有为服务器上的资源指定 URL 的情况下创建新类型的记录(例如,POST 到 /articles/23/comments 返回 201 状态和 Location: /articles/23/comments/283136 标头)。因此,在您的情况下(使用序列/自增 ID),您将使用该方法。
但是,HTML(和因此Web表单)不同。它只知道 GET 和 POST,不知道 DELETE 和 PUT。 对于删除和更新操作,它会重载 POST 方法。
这就是为什么 Agavi 默认将 POST 映射到“写入”而将 GET 映射到“读取”的原因 - 这是最常见的用例,“读取”和“写入”之所以被选择是因为它们相对中立,并且在某种程度上代表了 GET 与 POST 的安全方面(安全性如“GET 可以在没有副作用的情况下调用”等)。
您可以在 factories.xml 中更改 AgaviWebRequest 实现的动词映射;如果需要帮助,请参考 Agavi 用户邮件列表或 IRC 频道(或在此处提问)。在 IRC 频道上许多人还具有 URL 方案设计方面的丰富经验,以防您需要更多关于制作 API 的帮助。

谢谢你的回答。是的,我看到了一些关于如何在factories.xml文件中更改它的说明。我很想知道为什么Rails和Agavi在处理这个问题上有所不同。我认为,你的回答给了我一个新的视角来看待这个问题。 - txwikinger
澄清一下,你应该指定“HTML 4.01”,因为HTML5的工作草案增加了其他HTTP动词到Web表单中。 - aehlke

2

PUT视为创建的方式不如将其视为“放置”。您可以将资源放置在URI上(即将整个资源发送到URI)。

PUT http://example.com/articles/1

如果您重复执行此操作(将完整的相同资源发送到相同的URI),则会获得相同的结果,并且您没有更改该URI上的资源,这就是其幂等性。
如果Agavi实现的PUT方法是幂等的,则它正确地实现了PUT方法。否则,它没有这样做。

感谢您的回答。我正试图弄清楚Agavi的PUT方法是否幂等。 - txwikinger

0

PUT 可用于创建资源,但如果资源已存在(或已由先前的 PUT 创建),它将仅更新该资源。POST 不应更新资源,但如果这是简单的 CRUD,则可以更新。

还要注意,HTTP 动词不一定具有特定操作的定义映射,因为它们不仅对 CRUD 有用。

此外请注意,此问题与 REST 无关 - 只与适当的 HTTP 使用有关。请删除 REST 标签。


1
谢谢您的回答。我的问题是询问Agavi是否适当地使用了REST,因此加了这个标签。 - txwikinger
无论如何,我重新打标签以删除REST标签 - 我认为你对REST有一个错误的解释。你在这里真正想表达的是“如果Agavi适当地使用HTTP”。 - aehlke

0

谢谢您的回答。我知道 factories.xml 的配置。我/曾经对正确的原则感兴趣,因为不同的框架似乎会以不同的方式进行。 - txwikinger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接