MDN的Fetch示例里面单个文件上传用了PUT
,多个文件上传用了POST
。
所以文件上传究竟用PUT
还是POST
?
不要在不适合的地方,强行套用 RESTful,并不是所有的接口都可以 RESTful 化。
对于文件上传,大部分情况下应当还是使用 POST 的方式,尤其是上面代码里面示例中同时有表单和文件的情况。
除了发送还应当考虑服务端接收,以 PHP 为例,如果你使用 POST 上传文件的方式,那么你在后端是可以直接使用 $_FILES
来获取上传好的文件信息进行处理,但是如果你使用 PUT ,就需要你自己去获取原始请求体进行解析,请求提就有可能是一个 multipart/form-data
、也有可能是 application/x-www-form-urlencoded
,对于后端开发来说并不是那么的妙。
除此之外,虽然在 RESTful 中,对于 PUT 的定义是全量更新。而在其他的一些常见,对于文件而言,PUT 更有写入的意思,也就是常见的 对象存储(OSS)
对于这类业务来说, PUT 就可以被认为是要写入一个文件,整个请求体中,就只有文件的原始内容。
在业务中, 对于文件上传的处理,大多数时候,都是提供一个单独的文件上传接口进行上传,所有的上传都是通过这一个接口来完成。在文件上传完成后,接口返回文件的下载地址或者一个ID,用于存储,这样也更加便于统一管理上传资源,而不是担心某天在哪个接口突然又加了一个文件上传,为了这种情况又去修改那个接口的代码。
你要你愿意,你甚至可以用GET
请求上传文件,因为怎么处理请求完全是后端行为。
不过尽可能符合HTTP语义是约定俗成的行为,不管你用不用REST风格。
按照HTTP语义,GET
请求应该是读取服务器资源,PUT
请求和POST
请求应该都是修改服务器资源,并且GET
和PUT
应该是幂等操作,而POST
不保证幂等性。
按照这个大原则去设计即可。
上传文件不存在选 POST 还是 PUT 的问题
POST 表示新增
PUT 表示修改
你的截图里面说的很清楚,PUT 是修改头像,POST 是发表新文章