2009-08-22 56 views
2

agavi框架使用PUT请求创建和POST更新信息。通常在REST中,这是以其他方式使用的(通常指POST添加信息,而PUT替换整个数据记录)。php mvc框架agavi是否使用符合REST的CRUD?

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

谢谢。

回答

5

PUT可用于创建和更新完整记录。 POST通常用于部分更新和相关操作,也可用于在服务器上创建新类型的记录,而不指定资源的URL(例如POST to/articles/23/comments返回201状态和Location:/ articles/23 /评论/ 283136标题)。所以在你的情况下(使用序列/自动增量ID),你会使用这种方法。

但是,HTML(以及因此web表单)是不同的。它只知道GET和POST,而不是DELETE和PUT。对于删除和更新操作,它重载POST方法。这就是为什么默认情况下,Agavi将POST映射为“写入”并将GET映射为“读取” - 这是最常见的用例,选择“读取”和“写入”是因为它们相对中性,而且在方式代表GET和POST的安全方面(安全性如“GET可以被称为没有副作用”和等等)。

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

+0

感谢您的回答。是的,我看到了一些关于如何在factories.xml文件中对其进行更改的说明。我很想知道为什么rails和agavi在他们的方法上有所不同。我想,你的回答给了我一个关于这个问题的新视角。 – txwikinger 2009-08-26 19:45:31

+0

为了澄清,您应该指定“HTML 4.01”,因为HTML5的工作草案将其他HTTP动词添加到webforms。 – aehlke 2009-08-26 20:33:59

0

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

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

+1

感谢您的回答。我的问题是询问agavi是否正确使用REST,因此是标签。 – txwikinger 2009-08-26 19:43:39

+0

无论如何我重新删除了REST标签 - 我认为你对REST有一个错误的解释。你在这里的意思是“如果agavi恰当地使用HTTP”。 – aehlke 2009-08-26 20:32:40

2

不要将PUT视为创建,而应将其视为“放置”。你把一个资源放在一个URI上(即把整个资源发送给一个URI)。

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

如果你重复这个(发送到相同的URI同整个资源),你会得到相同的结果,你有没有在那个URI改变的资源,这是什么使得它幂等。

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

+0

感谢您的回答。 agavi的PUT是幂等的问题正是我想要弄清楚的。 – txwikinger 2009-08-26 19:46:46

0

我以前有过这个问题。这可以通过changing the factories.xml

+0

感谢您的回答。我知道有关factories.xml配置。我对原理感兴趣,应该如何正确完成,因为不同的框架似乎有不同的做法。 – txwikinger 2009-08-27 13:13:08