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