文件上传的PUT与POST使用Zend Framework构建RESTful api

wor*_*ran 51 api rest upload post put

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

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

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

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

  1. 用户发送GET请求以检索要PUT到的文件的特定URL.
  2. 然后,用户从GET响应向URL发送PUT请求.正在上传的文件与用户上传时完全一样.

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

如果您知道"最佳"方式,请随时发表评论.

Don*_*ows 123

这里似乎有很多误解.PUT与POST是不是真的有关更换与创造,而是关于幂等和资源命名.

PUT是幂等操作.通过它,您可以将资源名称和实体放置为该资源的内容(可能还有服务器生成的附加内容).至关重要的是,连续两次执行操作应该会产生同样的事情,就好像它只执行一次或完成20次一样,对于"相同的事情"的一些相当宽松的定义(它不必是字节为 - 字节相同,但用户提供的信息应完好无损).您永远不会希望PUT导致金融交易被触发.

POST是一种非幂等操作.你不需要给您正在寻找已创建的资源的名称(也没有一个POST 必须创建;如果它希望它可以删除重复的资源).POST通常用于实现"创建具有新名称的资源并告诉我名称是什么" - "新命名"所暗示的幂等性缺乏与之相符.在创建新资源的情况下,在Location头中发回资源的定位器是完全正确的.

现在,如果你采取的策略立场是客户端永远不应该创建资源名称,那么你就可以使POST完全适合创建(虽然理论上它可以根据提供的实体做任何事情)和PUT是如何进行更新.对于许多有意义的RESTful应用程序,但不是全部; 如果呈现给用户的模型是文件系统,让用户提供资源名称会产生很大的意义,并且PUT成为主要的创建操作(并且POST被委托给不太常见的事情,比如创建一个空目录等等on; WebDAV进一步减少了对POST的需求).

摘要:不要考虑创建/更新,而是考虑谁创建资源名称以及哪些操作是幂等的.PUT实际上是创建或更新,POST实际上是做任何事情 - 不应该重复 - 不知不觉.

  • 繁荣。很好的解释,感谢您花时间充实它! (2认同)

小智 9

对于文件上传,除非它正在替换现有资源,否则一定要使用POST.

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

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