Rest 我是否可以发明自己的HTTP状态代码,用于更新实体时,服务器返回更新实体的表示?

Rest 我是否可以发明自己的HTTP状态代码,用于更新实体时,服务器返回更新实体的表示?,rest,http,api-design,http-status-codes,Rest,Http,Api Design,Http Status Codes,本尼 我认为这将是一个明显的考虑,这是不是,事实上,该公司的网站 负责HTTP状态代码的标准机构,但只是一个方便的工具 用户界面优于或的网站 显然,这是我的错误假设 部分因此,本着科学精神,如果你是默认蓝色、信使和页面滚动的粉丝,那么 你需要打包午餐,然后退房。或者,如果您对断开的图像链接也有一种癖好,那么您可以在中找到可能完全相同的信息 否则,我发现这是一个非常方便的方法 网站提供了准确的信息,在二月寒冷下雪的日子里,这只是一个小小的快乐 这让我抓狂,官方似乎涵盖了所有可能遇到的场景,但对

本尼

我认为这将是一个明显的考虑,这是不是,事实上,该公司的网站 负责HTTP状态代码的标准机构,但只是一个方便的工具 用户界面优于或的网站

显然,这是我的错误假设 部分因此,本着科学精神,如果你是默认蓝色、信使和页面滚动的粉丝,那么 你需要打包午餐,然后退房。或者,如果您对断开的图像链接也有一种癖好,那么您可以在中找到可能完全相同的信息

否则,我发现这是一个非常方便的方法 网站提供了准确的信息,在二月寒冷下雪的日子里,这只是一个小小的快乐

这让我抓狂,官方似乎涵盖了所有可能遇到的场景,但对于您的系统需要处理的任何类型的更新/补丁请求,都有非常蹩脚和不可靠的选项。

缺乏选择

200行 客户:嘿,服务器,我刚才的请求怎么了 派你来的? 服务员:没什么不好的

这太模糊了,毫无用处。为了客户,为了客户 系统,用于记录,用于分析,用于整个互联网。但这是唯一的选择 我找到了一个实际返回 更新的资源。

202接受 客户:嘿,服务器,我的请求发生了什么 刚派你来? 服务员:我收到了

再说一次,也许这里有更多的细节?这是可以理解的 可用于长时间运行的任务,当 他们首先提交长时间运行的任务,但一旦 长时间运行的任务完成了,我们回到默认的200 OK。但是 同样,对于像更新你的帐户这样的“标准”更新是没有用的 例如,生物。

204无内容客户端:嘿,服务器,我刚才发送的更新请求的状态是什么?服务员:我明白了,完全明白了 更新。您也应该更新您端的实体。客户: 伟大的但是你没有在回复中发送实体。 服务员:当然不是,我不需要。我在信中给你留了个暗示 标题。客户:好吗?这样我就可以查看您的 响应并获取发送另一个请求所需的元信息 要获取更新的实体吗?看起来你可以直接发送 告诉我更新的实体。服务员:我没什么要说的了 这件事

我的意思是,服务器上有更新的实体。为什么 将其作为响应的主体发送回去是非法的吗?再说一次,没用 对于一个简单的更新请求。

205重置内容客户端:嘿,服务器,我发送的更新请求的状态如何?服务员:我明白了,我完全明白了 更新。你也应该在你这边更新它。客户: 令人惊叹的但是你没有把更新的实体发还给我? 服务员:当然不是,那是违法的!客户:真的吗?因为 您似乎可以轻松地将更新的实体附加到 你回复的主体,然后我就不必再发送请求了 只是为了得到更新的实体

就这些。它们中没有一个对完整描述帐户生物更新和返回的更新实体的成功结果有用

问题

那么,我可以自己编一个HTTP状态码吗? 209实体更新。 对于不同的客户端和浏览器, SDK等已经加入了处理状态代码的规则。 还有人这样做过吗? 我知道Twitter回归了他们的超级时尚。他们的智慧给我们留下了深刻的印象,似乎并没有破坏互联网。但这也是一种罕见的用于速率限制的错误代码,而不是典型的成功代码。 在官员的职权范围之外,着色会带来哪些陷阱?
首先,受信任的状态代码列表是来自而不是您在问题中使用的状态代码列表

现在,回到你的问题。。。一旦可扩展,就可以创建新的状态代码。但这并不意味着你应该这么做

状态代码旨在描述服务器试图理解并满足客户机相应请求的结果。下面引用的中定义的状态代码涵盖了您在问题中描述的场景。没有必要为此定义另一个状态代码

200 OK状态代码表示请求已成功。 在200响应中发送的有效负载取决于请求方法。 对于本规范定义的方法,其预期含义如下: 有效载荷的计算可总结为:

GET:目标资源的表示形式

HEAD:与GET相同的表示形式,但没有表示形式数据

职位:代表 行动的状态或结果

放置、删除:操作状态的表示

选项:通信选项的表示

跟踪:终端服务器接收到的请求消息的表示形式

现在请参阅中描述方法语义的部分:

如果目标资源没有当前表示形式,则 PUT成功创建一个,则源服务器必须通知 用户代理发送201创建的响应。如果目标 资源确实具有当前表示形式,并且该表示形式 根据所附文件的状态成功修改 表示,则源服务器必须发送200 OK或 204无内容响应,表示已成功完成 请求

以类似的方式,它也适用于返回已修补资源的表示形式的请求

如果客户端不需要已修改资源的表示形式,则返回

为了获得最佳解决方案,您可能希望允许客户机决定是否需要表示。为此,可以将中定义的标头与首选项一起使用,其中的值可以是表示或最小值:

return=representation首选项表示客户端希望服务器在对成功请求的响应中包含表示资源当前状态的实体

另一方面,return=minimal首选项表示客户机希望服务器仅返回对成功请求的最小响应。通常,此类响应将利用204无内容状态,但可酌情使用其他代码,例如具有零长度响应实体的200 OK状态。确定什么构成适当的最小响应完全由服务器决定


旁注:新的状态代码应遵循中所述的。

您可能需要在此重新定义。HTTP状态代码不表示业务逻辑响应,它们是从HTTP协议的角度来表示的。200 OK表示服务器已执行您根据请求发出的请求。这是有意宽泛的,因为请求可能是实际上无限多个业务逻辑请求中的一个。服务器执行的每种可能的请求或操作都不可能有唯一的代码,因为这对于每个应用程序都是唯一的

如果您已通过PUT请求请求服务器更新某些数据,则200 OK表示“我已根据请求成功更新该数据”。没有特别需要用更具体的代码来区分这一点。大概您知道您对服务器的请求,200 OK表示该请求已完成

确实存在的更具体的2xx代码从HTTP的角度表达了一些独特的东西。201 Created意味着现在可以使用具有新URI的新资源,并且该URI已在Location标头中返回。202 Accepted意味着服务器可能会满足您的请求,但尚未完成,因此此时没有新资源可供您查看,并且/或者更改尚未反映到当前资源中。204无内容表示服务器满足了您的请求,但响应不包含任何正文数据,因此客户端不需要/不应该尝试以任何方式处理响应正文

所有这些回答都意味着同一件事:您的请求已成功执行。它们只是在对该请求的响应中表达了细微差别,而这与该请求所表达的行动无关。所有这些响应代码对于任何类型的操作都同样有效,无论是更新、创建、删除还是任何其他类型的操作


要敲打这个主页,服务器可能会响应DELETE/user/42请求,并创建201;如果删除可能需要一段时间才能真正执行,并且现在有了一个新的URI,您可以在其中检查该操作的状态,那么这将是有意义的。201 Created并不意味着“创建了一个新用户”,它意味着“该请求已被接受,因为它在2xx范围内,并且与该请求相关的新HTTP资源可能需要签出。”

不管它值多少钱:我在QA工作,并且已经测试REST API大约10年了。我还没有遇到过一个前端开发人员,他给出了一个关于HTTP状态码的提示。@SiKing Hahaha。是的。我的意思是,事实上有五个以上的1,2,3,4,5几乎是没有意义的。我们现在都在互联网上拖拽这个模糊的、几乎是无用的、经常令人困惑的规范,原因是什么?200 OK并在体内返回数据到底有什么问题@deceze这对我来说不够具体。假设创建资源时201是正确的代码,为什么会出现这样的错误
其他任何手术都可以吗?谢谢你花时间写这么好的答案。你很好地解决了这个问题。你没有错。我完全明白。我只是觉得规格不对。您的DELETE示例很好地总结了这一点。我知道从技术上讲,删除请求可以从服务器收到以201 Created形式的法律响应,我只是认为这在逻辑上是荒谬的。这就是你的问题。谢谢你花时间把这件事说得这么详细。您在当前规范的范围内提出了一个很好的论点。我只是不同意当前规范。201存在的事实足以让209以与创建201相同的方式更新。事实上,规范是如此零碎,这让我得出结论,它基本上是无用的。这就是为什么我怀疑绝大多数程序员只使用了它的10%。