代码之家  ›  专栏  ›  技术社区  ›  txwikinger

php mvc框架agavi使用CRUD兼容REST吗?

  •  3
  • txwikinger  · 技术社区  · 15 年前

    Agavi框架使用创建和发布的Put请求来更新信息。通常在REST中,这是另一种方法(通常指在放置替换整个数据记录时添加信息)。

    如果我理解正确的话,重要的问题是Put必须是等幂的,而Post没有这个要求。因此,我了解了如何创建一个新记录可以是等幂的(即,多个请求不会导致一个记录的多个创建),特别是当ORM通常使用一个ID作为主键,并且一个新记录的ID不会为客户机所知(因为它是在数据库中自动创建的),因此不能作为请求的一部分。Agavi如何根据Put请求保持等幂性的要求?

    谢谢。

    4 回复  |  直到 12 年前
        1
  •  5
  •   dzuelke    15 年前

    Put可用于创建和更新完整记录。post通常用于部分更新和相关操作,以及在服务器上创建新类型的记录,而不指定资源的URL(例如post-to/articles/23/comments返回201状态和位置:/articles/23/comments/283136头)。所以在您的案例中(使用序列/autoincrement id),您将使用这种方法。

    但是,HTML(以及Web表单)是不同的。它只知道获取和发布,而不知道删除和放置。对于删除和更新操作,它将重载post方法。

    这就是为什么默认情况下,Agavi将post映射到“write”和“get to”的原因——这是最常见的用例,之所以选择“read”和“write”,是因为它们相对中性,并且在某种程度上代表了get vs post的安全性(安全性与“get can be called without side effects”和blah相同)。

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

        2
  •  2
  •   rojoca    15 年前

    而不是思考 PUT 在创造的过程中,把它想象成“投入”。您将一个资源放在一个URI上(即将整个资源发送到一个URI)。

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

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

    如果阿加维实施 是等幂的,那么它正在实现 正确地。否则就不是了。

        3
  •  0
  •   aehlke    15 年前

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

    还要注意,这个问题与REST无关——只是正确的HTTP用法。所以请去掉其余的标签。

        4
  •  0
  •   Mosty Mostacho    12 年前

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