我正在设计一个API Rest服务,允许用户将文件上传到服务器。
我认为这是一个PUT请求,它将转到server / resource / ID并将文件作为base64放在json请求体中。
我的问题是这个ID。在我的脑海中,我将文件传递给服务器,服务器应该负责存储该文件并生成一个唯一的ID以便以后检索它,然后将此ID返回给具有ok状态的客户端。
所以我正在考虑这样做,将它发送到服务器/资源,没有ID,但这样做还是设计不好?
答案 0 :(得分:5)
关于问题的实际标题,我不同意@TatsuyukiIshi给出的接受答案。 PUT
的语义是:将给定URI当前可获得的内容替换为请求中包含的有效负载。如果可以在没有ID的情况下识别资源,即只存在其中一种资源,则可以在不指定ID作为"单例资源的ID的情况下解决更新。已经在端点本身中隐式给出了。虽然,我不得不承认这种情况很少发生。
这种情况可能是类似于资源的剪贴板,您可以在其中放置任意内容并在以后检索它。当然,您也可以使用POST
,尽管使用POST
请求收到的正文的语义不太清楚。与POST
操作相反,PUT
也不是幂等的。
然而,使用类似PUT /api/messages
的内容通常意味着将所有消息替换为随请求发送的内容,这可能不是您真正想要的。通常,您只想一次修改单个资源,因此使用标识该特定资源的附带ID。
关于问题的实际内容,通过POST
上传文件是常见做法。成功上传后,您将返回201 Created
响应,其中包含指向生成资源的Location
HTTP标头。通过POST
请求接收的服务处理内容的行为完全取决于服务实现者。因此,您可以创建新资源,执行一些后备任务,而无需任何实际资源创建或其他任何事情(规范不禁止更新)。
答案 1 :(得分:0)
没有。 PUT表示“创建或更新”,并且应该带有显式ID。 POST适合创建新内容。
另请参阅:PUT vs POST in REST
答案 2 :(得分:-1)
对你来说太晚了,但我遇到了同样的问题并发现了很多错误的信息,所以我会在这里找到一个找到的信息。
有2个规则RESTful的RFC,关于这个问题的RFC是RFC 7231,你会发现:
PUT方法请求目标资源的状态 用表示定义的状态创建或替换 包含在请求消息有效负载中。
所以你不能在没有身份证的情况下发送PUT。
许多RESTful API即使在更新时发送POST,这也是同一个RFC的错误,因此您应该始终发送ID以使用PUT创建它,或者应该使用POST来创建和PUT来更新,但请记住应该总是创建POST,换句话说,如果你没有先用GET查找它,你将复制你的文件。