RESTful最佳实践。这是否违反了无状态约束?

RESTful最佳实践。这是否违反了无状态约束?,rest,loopbackjs,Rest,Loopbackjs,我有一个关于遵守RESTful原则的具体例子,具体来说: 无状态:一个客户端可以向服务器发送多个请求;然而,它们中的每一个都必须是独立的,也就是说,每一个请求都必须是独立的 包含所有必要的信息,以便服务器能够 理解它并相应地处理它。在本例中,服务器 不得保存有关客户端状态的任何信息。任何信息 状态必须保留在客户端–例如会话。(引自: ) 现在,假设用户可以通过发布以下内容创建新事件: { "name": "string", "radius": 50, "status": 0, "

我有一个关于遵守RESTful原则的具体例子,具体来说:

无状态:一个客户端可以向服务器发送多个请求;然而,它们中的每一个都必须是独立的,也就是说,每一个请求都必须是独立的 包含所有必要的信息,以便服务器能够 理解它并相应地处理它。在本例中,服务器 不得保存有关客户端状态的任何信息。任何信息 状态必须保留在客户端–例如会话。(引自: )

现在,假设用户可以通过发布以下内容创建新事件:

{
  "name": "string",
  "radius": 50,
  "status": 0,
  "location": {
    "lat": 0,
    "lng": 0
  },
  "commonUserId": 0
}
应用程序的设置方式是,用户可以通过发布以下内容来完成相同的任务:

{
  "name": "testing",
  "radius": 50,
  "status": 0,
  "location": {
    "lat": 0,
    "lng": 0
  }
}
请注意,
commonUserId
在第二个示例中不存在。
commonUserId
是数据库中的外键,是创建新记录所必需的

创建新记录时不需要这样做的原因是,应用程序正在使用客户端提供的访问令牌来使用某种逻辑获取用户id(已验证的用户id)。然后,应用程序使用检索到的id(从逻辑)来创建插入/记录

现在我的问题是,这是否违反了restful api的无状态约束?

我可以从两方面论证:

这不是违规行为,因为所有数据都是由客户在技术上提供的。尽管客户端依赖于某些应用程序逻辑来实现它

这是一个违规行为,因为客户端依赖应用程序逻辑来获取用户id。应用程序必须查找用户id,而不是客户端将其发送过来

我问这个问题的原因是因为我可以将id作为客户端需要提供的信息的一部分,但是由于需要accessToken,应用程序可以使用它来获取id

也许我想得太多了?什么是最佳实践?是否由开发商决定这种情况?还有其他人遇到这个问题吗?你会如何处理这件事?为什么

旁注:我正在用环回构建这个

编辑:


所以我想这里有一个潜在的问题。依赖访问令牌作为获取其他信息的手段可以吗?

您没有过度思考。在编写代码时记住这些东西,这真是太棒了。一些年后的人在看代码时会感谢你做出了正确的决定

现在进入主题。如果我是你,我就不会有“commonUserId”,我是从安全角度说的。因为我必须验证commonUserId值,以查看它是否首先存在于我的系统中(不信任客户端输入),或者它实际上属于authenticate用户(在您的情况下是访问令牌)。因此,出于这个原因,我将不再使用它,而是依靠访问令牌和应用程序逻辑来识别用户

事实上,这两种方法都可以,但请确保您不会盲目信任客户机输入,即使应用程序首先设置了该值

祝你好运

现在我的问题是,这是否违反了restful api的无状态约束

无状态(在REST环境下)的明确定义来自Roy Fielding论文的第三章,他在第三章中描述了分层风格

客户机无状态服务器样式源自客户机-服务器,附加的约束是服务器组件上不允许任何会话状态。从客户端到服务器的每个请求必须包含理解请求所需的所有信息,并且不能利用服务器上存储的任何上下文

。。。由于不必在请求之间存储状态,服务器组件可以快速释放资源并进一步简化实现,因此可伸缩性得到了改进

菲尔丁在论文的第6章中讨论了在服务器上存储会话状态的部分问题

当浏览器的历史记录功能(“后退”按钮)随后用于备份到cookie反映的视图之前的视图时,浏览器的应用程序状态不再与cookie中表示的存储状态匹配。因此,发送到同一服务器的下一个请求将包含一个曲奇,该曲奇歪曲了当前的应用程序上下文,从而导致双方的混淆

因此,您可以使用消息体中的信息,并使用“应用程序逻辑”对其进行转换。类似地,您可以使用消息头中的信息,并使用“应用程序逻辑”来转换这些信息

您遇到的麻烦是使用请求中的信息来查找会话状态——也就是客户机在前面的消息中告诉您的

依赖访问令牌作为获取其他信息的手段可以吗

看情况而定

“此请求包括访问令牌12345,因此commonUserId应为67890,因为令牌12345始终是这样。”这样就可以了


“此请求包括访问令牌12345,因此commonUserId应为67890,因为之前有一个使用令牌12345的请求告诉我们使用commonUserId 67890”我认为您在这里混淆了两件事-请求身份验证和请求数据

访问令牌确保在令牌有效的情况下处理请求数据

然后,应用程序的业务逻辑负责解释请求数据,将其映射到数据模型上,并决定在创建事件时使用什么作为用户id。假设访问令牌仅将用户Admin标识为请求的发起人,请求数据包含用户Boy的id,即请求为其创建事件的
commonUserId

使用访问令牌标识用户是
loopbackjs