3

agavi 框架使用 PUT 请求进行创建,使用 POST 请求更新信息。通常在 REST 中使用相反的方式(通常指的是 POST 添加信息,而 PUT 替换整个数据记录)。

如果我理解正确,重要的问题是 PUT 必须是幂等的,而 POST 没有这个要求。因此,我想知道如何创建新记录是幂等的(即多次请求不会导致多次创建记录),特别是当 ORM 通常使用 id 作为主键并且新记录的 id 不知道时到客户端(因为它是在数据库中自动创建的),因此不能成为请求的一部分。鉴于此,agavi如何对PUT请求保持幂等性的要求。

谢谢。

4

4 回答 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 映射到“write”,将 GET 映射到“read”——这是最常见的用例,之所以选择“read”和“write”是因为它们相对中立,并且在某种程度上也代表了安全性GET 与 POST 的各个方面(安全,如“可以在没有副作用的情况下调用 GET”等等)。

您可以在 factory.xml 中更改 AgaviWebRequest 实现的动词映射;如果您需要帮助,请参阅 Agavi 用户邮件列表或 IRC 频道(或在此处询问)。IRC 频道上的很多人在 URL 方案设计方面也非常有经验,以防您需要更多帮助来使您的 API 更漂亮。

于 2009-08-24T23:02:53.330 回答
2

与其将PUT其视为创造,不如将其视为“投入”。您将资源放在 URI 上(即将整个资源发送到 URI)。

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

如果您重复此操作(将相同的整个资源发送到相同的 URI),您将得到相同的结果并且您没有更改该 URI 处的资源,这就是使其具有幂等性的原因。

如果 agavi 的实现PUT是幂等的,那么它是PUT正确实现的。否则不是。

于 2009-08-24T23:20:36.960 回答
0

PUT 可用于创建资源,除非该资源已存在(或已由先前的 PUT 创建),它只会更新它。但是,如果这是简单的 CRUD,则 POST 不应更新资源。请注意,HTTP 动词不一定具有到某些操作的定义映射,因为它们不仅仅对 CRUD 有用。

另请注意,这个问题与 REST 无关——只是正确的 HTTP 使用。所以请删除 REST 标签。

于 2009-08-24T14:12:58.843 回答
0

我以前遇到过这个问题。这可以通过更改 factory.xml来解决

于 2009-08-27T04:23:28.500 回答