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

为什么JSON应该有状态属性

杭昊空
2023-03-14

我无意中发现了一种非常普遍的做法。我甚至发现了一个网页,给它起了个名字,但我忘了名字,在谷歌上再也找不到那个网页了。

实践是,来自REST服务的每个JSON响应都应该具有以下结构:

{
    "status": "ok",
    "data": { ... }
}

或在错误情况下:

{
    "status": "error",
    "message": "Something went wrong"
}

我的问题:JSON中为什么需要这样一个“status”属性?在我看来,这就是HTTP状态码的用途。

REST使用客户端和服务器之间的HTTP通信方式,例如,删除应该使用“DELETE”动词。同理,一个资源找不到就应该用404等等。因此,按照这种思路,任何错误情况都应该在HTTP状态中正确编码。

在错误情况下返回HTTP 200状态代码并将错误保留在JSON中是否有特定的原因?在处理响应时,这似乎使javascript条件分支更加复杂。

我发现有些情况下,状态可以是“重定向”,以告诉应用程序重定向到某个URL。但是如果使用了正确的HTTP状态代码,浏览器将“免费”执行重定向,从而正确地维护浏览历史记录。

我主要想从你那里得到两个可能的答案:

  • 或者有两个争吵的社区,每个社区都有自己喜欢的方法(始终使用HTTP状态与从不使用HTTP状态)
  • 或者我遗漏了一个重要的观点,您会告诉我,虽然HTTP状态应该用于某些情况,但在某些特定情况下,HTTP状态不适合,并且“status”JSON属性起作用

共有3个答案

百里默
2023-03-14

HTTP状态码可能由很多因素引起,包括负载平衡器、代理、缓存、防火墙等。这些因素都不会修改JSON输出,除非它们完全破坏JSON输出,否则也会被视为错误。

一句话:通过JSON做这件事更可靠。

公西季
2023-03-14

您将在此处混合两个不同的层:

>

当使用JSON交换数据时,您当然可以省略status属性,但是如果您只读取一个属性就知道JSON是否包含您请求的对象或错误消息,那么解析JSON就更容易了。

因此,是的,返回一个200状态代码并在JSON中有一个“status”:“error”属性是完全正常的。

万嘉石
2023-03-14

你是对的。我认为你所看到的是人们没有正确做REST的副作用。或者根本不做Rest。使用REST并不是设计良好的应用程序的先决条件;没有规则要求webapp必须是REST-ful的。

另一方面,对于错误条件,有时应用程序希望返回200代码,但返回错误表示业务逻辑故障。HTTP错误代码并不总是与应用程序业务错误的语义相匹配。

 类似资料:
  • 问题内容: 从 React v15.3.0 知道,我们有了一个名为 PureComponent 的新基类,以扩展内置的 PureRenderMixin 。我了解的是,在幕后,它对内部的道具进行了浅浅的比较。 现在,我们有3种方法来定义React组件: 功能性无状态组件,不扩展任何类 扩展类的组件 扩展类的常规组件 一段时间以前,我们曾经将无状态组件称为“纯组件”,甚至称为“哑组件”。似乎“纯”一词

  • 有人能用一个真实的例子来帮助我理解React中的状态吗?

  • 问题内容: 最近,我和一些同事正在讨论AngularJS服务是否应具有状态。我们提出了一些反对和反对的论据,我想就此话题获得更多的想法和反馈。在我的搜索中,我发现了这一点,但似乎没有提及任何明确的最佳实践。在无客户端世界中,服务永远都不应保持状态,但是我开始认为它可能是客户端可以接受的,因为它是一个不同的问题。 服务保持状态的原因: 该服务不会被多个线程访问。每个浏览器都有其自己的服务实例。 允许

  • 我在这里没有任何参考来展示我的研究(因为没有一个链接是切中要害的),甚至谷歌也没有一个确切的答案。每个人都说web服务是有状态的,但这是令人困惑的。原则上,我相信,SOAP是有状态的,而REST是无状态的。那么,为什么/如何SOAP是有状态的?

  • 使用 san-store 进行应用状态管理,就要先接受它的理念: 单向流 全局唯一的应用状态源 状态更新模式单一,不能通过store直接更新应用状态 那么,使用 san-store 进行应用状态管理,和自己在组件里完成所有事情,有什么区别呢? 自己管理你的应用状态 自己在组件里完成所有事情,意味着你需要自己管理你的应用状态。经验丰富的开发人员能够凭着设计经验和直觉让应用良构,但在不断的迭代与新需求

  • 我是JavaEE的新手,我试图找出无状态和有状态会话bean之间的区别。到目前为止我所理解的: 1.)在有状态会话bean中,bean的状态与客户机绑定;因此,只要我们与同一个用户在同一个会话中,就应该有相同的bean实例状态 2.)在无状态会话bean中,没有绑定到会话和客户机的状态;事实上,bean实例可以在用户的每次调用或请求中进行交换 为了尝试这一点,我编写了一个简短的servlet,它只