我可以没有身份证吗?

时间:2017-04-13 11:33:34

标签: rest api-design

我正在设计一个API Rest服务,允许用户将文件上传到服务器。

我认为这是一个PUT请求,它将转到server / resource / ID并将文件作为base64放在json请求体中。

我的问题是这个ID。在我的脑海中,我将文件传递给服务器,服务器应该负责存储该文件并生成一个唯一的ID以便以后检索它,然后将此ID返回给具有ok状态的客户端。

所以我正在考虑这样做,将它发送到服务器/资源,没有ID,但这样做还是设计不好?

3 个答案:

答案 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查找它,你将复制你的文件。

有关详细信息:https://tools.ietf.org/html/rfc7231#section-4.3.3