60

我正在通过 Zend_Rest_Route 使用 Zend Framework 构建一个 RESTful API。对于文件的上传,我应该使用 PUT 还是 POST 来处理这个过程?我试图与 REST 动词的定义尽可能一致。请参考:PUT 或 POST:故事的其余部分

我理解这一点的方式是,当且仅当我更新指定资源的全部内容时,我才应该使用 PUT。我必须知道使用 PUT 的确切 URL。另一方面,如果我使用一些服务器端算法向服务器发送命令以创建指定资源的下属,我应该使用 POST。

假设这是一个用于上传图像的 REST API。这是否意味着如果服务器要操作图像文件(即创建缩略图、调整大小等),我应该使用 POST;如果我只想将原始图像文件保存到服务器,请使用 PUT?

如果我使用 PUT 处理文件上传,流程应该如下:

  1. 用户发送 GET 请求以检索特定 URL 以通过 PUT 上传文件。
  2. 然后用户向该 URL 发送 PUT 请求。
    上传的文件是原始文件 - 正是用户上传的文件。

我对这些东西很陌生;所以希望我在这里有意义......

如果您知道执行此操作的“最佳”方法,请随时发表评论。

4

4 回答 4

150

这里似乎有很大的误解。PUT 与 POST 并不是真正关于替换与创建,而是关于幂等性和资源命名。

PUT 是幂等操作。使用它,您可以指定资源的名称和要放置为该资源内容的实体(可能带有服务器生成的附加内容)。至关重要的是,对于“同一件事”的一些相当松散的定义,连续执行两次操作应该会产生与只执行一次或执行 20 次相同的事情(它不必逐个字节)字节相同,但用户提供的信息应该是完整的)。您永远不会希望 PUT 触发金融交易。

POST 是非幂等操作。您无需提供要创建的资源的名称(也不必创建 POST 如果需要,它可以对资源进行重复数据删除)。POST 通常用于实现“使用新创建的名称创建资源并告诉我名称是什么”——“新创建的名称”所暗示的缺乏幂等性与此相符。在创建新资源的地方,在 Location 标头中发回资源的定位器是完全正确的做法。

现在,如果您采取客户不应该创建资源名称的政策立场,那么您会得到 POST 非常适合创建(尽管理论上它可以根据提供的实体做任何事情),而 PUT 则是如何进行更新。对于许多有意义的 RESTful 应用程序,但不是全部;如果呈现给用户的模型属于文件系统,则让用户提供资源名称非常有意义,并且 PUT 成为主要的创建操作(并且 POST 被委托给不太常见的事情,例如创建一个空目录等on;WebDAV 进一步减少了对 POST 的需求)。

总结:不要考虑创建/更新,而是考虑谁制作资源名称以及哪些操作是幂等的。PUT 真的是创建或更新,而 POST 真的是做任何事情——不应该重复——无所事事。

于 2013-01-18T15:53:05.493 回答
11

对于文件上传,除非是替换现有资源,否则一定要使用 POST。

在 REST 中,POST 是创建新资源,PUT 是替换现有资源,GET 是检索资源,DELETE 是删除资源。

资料来源:http ://en.wikipedia.org/wiki/Representational_state_transfer#RESTful_web_services

于 2012-12-19T12:34:44.093 回答
3

REST 不是一个标准,所以这很容易变成一场宗教斗争。被认为是“RESTful”的 AtomPub 和 OData 标准确实同意这一点:POST = 创建而 PUT = 更新

于 2011-06-08T02:34:58.350 回答
0

简单的答案是您应该在您的情况下使用 PUT 而不是 POST,因为您将替换文件的全部内容。看看PUT 与 POST

我必须知道要 PUT 的确切 URL

不,您不必知道 PUT 的 URL,即 PUT URI 不必在 PUT 操作之前出现。如果资源不存在,则创建资源。如果资源已经存在,则用新的表示替换资源。

引用链接的文章:

PUT 将页面放在特定的 URL。如果那里已经有一个页面,则将其全部替换。如果那里没有页面,则创建一个新页面。这意味着它就像一个 DELETE,然后插入具有相同主键的新记录

于 2011-06-08T02:31:53.610 回答