当前位置: 首页 > 知识库问答 >
问题:

HTTP PUT是否应该创建不存在的资源?

西门伟
2023-03-14

假设有人在我的EndInt上执行Put请求:

/resources/{id}

是否可以使用提供的ID创建资源?因为在数据库insert上手动分配ID不是最佳实践。

如果无法创建资源,是否应该返回404错误?

共有1个答案

方波娃
2023-03-14

首先,您使用的是一个过时的文档:RFC2616现在已经不再相关,任何使用这类文档作为参考的人都应该立即停止使用。

Mark Nottingham在撰写本报告时担任IETF HTTP工作组和QUIC工作组的联合主席:

不要使用RFC2616。从硬盘、书签中删除它,并刻录(或负责任地回收)打印出来的任何副本。

    null

如果您正在查找方法、状态代码和头定义,那么RFC7231就是您应该参考的文档。

说到这里,我们回到你的问题上来。

如果资源不存在,HTTPput是否应创建该资源?

但是,如果您的应用程序代表客户端生成资源标识符,就像您在问题中提到的那样,那么您应该使用post而不是put来创建资源。

下面引用了put方法定义的某些部分。最后一句话似乎与你最相关(突出部分是我的),支持了我刚才提到的内容:

4.3.4.放入

put方法请求创建目标资源的状态,或用请求消息负载中包含的表示定义的状态替换目标资源的状态。[...]

如果目标资源没有当前表示形式,并且put成功创建了一个表示形式,则源服务器必须通过发送201(已创建)响应通知用户代理。如果目标资源确实具有当前表示形式,并且该表示形式已根据所包含表示形式的状态成功修改,则源服务器必须发送200(确定)或204(无内容)响应以指示请求的成功完成。[...]

如果无法创建资源,是否应该返回404错误?

这似乎是要返回的准确状态代码,因为没有找到所请求资源的表示形式:

6.5.4.404找不到

post方法请求目标资源根据资源自己的特定语义处理请求中包含的表示。例如,post用于以下函数(除其他外):

[...]

  • 正在创建源服务器尚未标识的新资源;

6.3.2.创建201个

201(已创建)状态代码指示请求已完成,并导致创建一个或多个新资源。请求创建的主要资源由响应中的location头字段标识,或者,如果未接收到location字段,则由有效请求URI标识。[...]

 类似资料:
  • 问题内容: 如果我这样做: 然后创建文件,并始终返回“文件存在”。是否可以不创建文件就检查文件是否存在? 编辑: 我忘了提到它处于for循环中。所以这是真实的东西: 问题答案: 实例化a时,您并没有在磁盘上创建任何东西,而只是构建了一个可以调用某些方法的对象,例如。 既好又便宜,不要试图避免这种实例化。 该实例只有两个字段: 这是构造函数: 如您所见,实例只是路径的封装。创建它以便进行调用是继续进

  • 我在我的演示android项目中使用库。我想知道我是否应该为登录请求创建一个不同的模型 对于我创建的请求,如下所示 从登录请求创建。 所以在上面,我为登录请求创建了一个模型

  • 我有一种感觉,我在这件事上完全错了。但无论如何。 我有一个sql数据库,它本质上是一个有目的的非规范化表,我构造这个表是为了使这项任务对我来说更容易,所以我可以从一个表中获取内容。 我有一张成双成对的桌子,像这样: 等等 所以对于我的neo4j图数据库,我希望每个用户ID作为一个节点,其他的东西不是太重要,但基本上是关系中的东西。 我只希望每个用户有一个节点,所以我的感觉是,如果我这样做: 当我们

  • 问题内容: 我对应该在哪里放置我的虚拟环境感到困惑。 在我的第一个django项目中,我使用以下命令创建了该项目 然后我进入djangoproject目录并运行命令 在与内部目录相同级别上创建了虚拟环境目录。 这是为特定项目创建virtualenv的错误位置吗? 我给人的印象是,大多数人将所有virtualenvs放在一个完全不同的目录中,例如,然后使用virtualenvwrapper在它们之间

  • 我正在写入一个CSV文件,并使用来完成。我有一个bean,它是我的类,我也有一个资源属性,在这里我提供了用于写出项的文件名。 是否可以将日期和时间附加到文件名? 现在我告诉它写入一个名为report.csv的文件,而不是我希望它写入一个名为report-7-2-2014-16-03.csv的文件 以下是作者的XML配置

  • 我使用Spring Tools来开发我的网站。在这个网站上,管理员可以上传图像和其他文件,如PDF和CSV,客户可以稍后下载。 使用Spring工具时,我将目标文件夹设置为static/images/以上载新图像,这非常有效。但是在我的Linux服务器上部署了这个jar之后,Spring boot找不到静态文件夹,所以我使用了我发现的这个函数:如何动态获取Spring boot应用程序jar父文件