REST and PHP multifile upload: what http status should return if some (but not all) files fail to upload?
所以,我正在构建一个基于PHP的CMS应用程序,该应用程序基于RESTful原则(虽然它肯定会转向它们),而且我遇到了一个两难的困境:
在POST一个上传多个文件的表单并且某些上传成功而另一些因文件名冲突而失败时返回的正确HTTP状态是什么?"409 Conflict"似乎对每个失败的上传都有意义,但对于包含一系列成功和失败的上传的整体POST,它似乎并不那么明确。
我的困惑是基于我认为多文件上传构成单个POST请求,而不是每个上传文件的POST请求。 那是对的吗?
-
您认为它以何种方式转向他们?
-
我使用会话变量来启用持久身份验证,而不是在每个请求上重新进行身份验证。也可以通过在任何URI的末尾添加/ login来调用登录表单。关于我的主要问题,也许我应该根据提交结果页面而不是文件上传来考虑这个问题。从某种意义上说,对服务器的请求是发布多个文件,所以我认为成功响应捆绑每次上传尝试的结果是有意义的,这就是发生的事情。但是,当发生错误时返回'200 OK'似乎很奇怪。
-
会话变量和服务器状态与REST无关。但这是另一个讨论。 :)想想如果你在POST成功后将PUT集合资源发生会发生什么。无论您输入多少次,都应该得到相同的结果。
-
我的理解是REST需要完全无状态,但是,确实是另一个讨论;)。无论如何,我不太确定我是否遵循了你的建议。你是建议链式请求(初始POST后跟每个文件的PUT)还是只是一种查看它的方式,以便"200 OK"对我更有意义?无论哪种方式,PUT和DELETE都不起作用(与REST的另一个偏差),因为主机服务器不支持它们。我已经考虑了链接请求,如果我真的无法与"200 OK"达成一个文件上传错误的POST。
-
我认为你所面临的两难困境源于你没有将上传文件的集合视为一个完整的单位。相反,您将其视为一种批量处理大量文件上载的方法。如果集合对您的应用程序没有语义含义,为什么不直接发送单独的POST?
-
该组文件在应用程序级别确实具有语义含义。例如,如果将收集资源指定为"图库",则可以仅添加图像或视频。我正在将目标集合视为内聚单元,并将批量文件作为一组要添加到其中的单个资源上载。
你是对的。如果要POST集合,则集合本身就是资源。因此,如果创建了集合资源,则返回201.如果已接受但未完全处理,则返回202。
如果您在服务器上使用多个文件实现资源的一部分,并且已经存在的文件妨碍了成功的POST,那么您将返回409而不创建集合资源并使整个操作失败。从REST的角度来看,这是一个原子操作。
另一方面,如果您支持此资源的PUT操作,则必须支持幂等性。因此,一种行为可能是简单地将作为资源一部分存在的任何文件替换为PUT主体所包含的内容。您也可以考虑对POST执行此操作,但这仅在现有文件名最多属于一个集合资源时才有效。否则你最终可能会破坏别人的收藏品。
-
哇,有什么了不起的,谢谢!第三段引起了我的注意;)。这个帖子真的帮助我更好地理解。我认为一个支持一系列PUT的POST非常适用于我的场景,因为该表单专门用于添加从中访问表单的集合的资源(我很确定这个表单也不是RESTful;只需添加/添加到任何URI调用它)。如果PUT遇到冲突,我想我会中止POST w / 409并给用户选项。
-
POST无法阻止一系列PUT。相反,可以通过更新服务器上的一系列文件来实现POST。如果其中任何一个失败,请用409中止POST。尽量避免在你正在做什么或不是RESTful的部分上绞尽脑汁。 REST是一种以6个约束为特征的架构风格(其中1个是可选的)。将架构限制在那些6,它是RESTful。因此,REST本身不适用于表单,也不适用于与URL有关的任何内容(除了使用它进行资源识别)。
-
嗯,fwiw,我的目标实际上不是确保应用程序是完全RESTful的,尽管不可否认我越往下这条道路越远,我被称为这条道路,我确实倾向于过度思考;)。对于关闭PUT的POST,我包含的链接建议POST指向处理封闭资源数据的资源,而PUT引用封闭资源本身。我将其解释为POST资源可以通过为每个资源创建PUT请求来处理资源集合。该线程和/或我的解释是否准确是另一回事;)