【问题标题】:Is a REST resource allowed to change over time?REST 资源是否允许随时间变化?
【发布时间】:2016-03-23 13:38:38
【问题描述】:

我想实现一个 REST API(对于本例中的视频游戏),并希望使其尽可能无状态(身份验证将是唯一的状态)。

我仍然对无状态的真正含义感到困惑:例如,连续两次调用

api.myhost.com/users/{playerid} 

可以及时提供2种不同的答案,例如:

{name: "toto", life: 98, score: 52}

{name: "toto", life: 12, score: 378}

问题:

  • 在访问相同的资源时提供不同的答案是否考虑破坏了 REST API 的无状态条件?
  • 在这种情况下改变规则(时间对资源的影响)是否被认为是一种公认​​的做法?
  • 如果不是,由于我想要表示的现实有一个状态(随时间变化),我应该如何将其转换为一个无状态模型?李>

【问题讨论】:

    标签: rest


    【解决方案1】:

    您所描述的 - 随着时间的推移返回不同值的 API - 非常好。这不是“无国籍”所指的。

    “无状态”意味着每个 REST 调用都应该是自包含的:服务器不存储任何(或很多)关于客户端的信息。客户端的状态——例如,他们在搜索结果的哪个页面,或者他们是否登录——没有存储在服务器上;客户端每次发出新请求时都必须重新发送。

    Here is a much more in-depth answer to a related question.

    【讨论】:

      【解决方案2】:

      REST 是无状态的

      REST 代表 Representational State Transfer,此架构由 Roy Thomas Fielding 在chapter 5 of his dissertation 中定义。

      Fielding 为 REST 架构定义了一组约束。其中一个约束是客户端和服务器之间的stateless 通信,定义如下(他的论文中没有重点介绍):

      5.1.3 Stateless

      [...] 从客户端到服务器的每个请求都必须包含理解请求所需的所有信息,并且不能利用服务器上存储的任何上下文。 因此会话状态完全保存在客户端上。 [...]

      因此,如果您在服务器上保持会话状态,您将破坏stateless constraint。因此,它不是 REST。在 REST 中,您不会在服务器上拥有会话,因此您不会拥有会话标识符。

      每个请求必须包含所有要处理的数据

      从客户端到服务器的每个请求都必须包含服务器能够理解的所有必要信息。有了它,您不再依赖于存储在服务器上的任何会话上下文。

      例如,当访问需要身份验证的受保护资源时,每个请求都必须包含正确验证/授权所需的所有数据。这意味着将对每个请求进行身份验证

      资源可以是静态的,也可以随时间变化

      根据菲尔丁的说法,资源可以是静态的,也可以随时间变化。看看他的论文:

      5.2.1.1 Resources and Resource Identifiers

      REST 中信息的关键抽象是资源。 任何可以命名的信息都可以是资源:文档或图像、时间服务(例如“洛杉矶今天的天气”)、其他资源的集合、非虚拟对象(例如一个人),等等。换句话说,任何可能成为作者超文本参考目标的概念都必须符合资源的定义。资源是到一组实体的概念映射,而不是在任何特定时间点对应于映射的实体。

      更准确地说,资源R是一个随时间变化的隶属函数MR(t),它对于时间 t 映射到一组等效的实体或值。集合中的值可以是资源表示和/或资源标识符。一个资源可以映射到一个空集,它允许在一个概念的任何实现存在之前对该概念进行引用——这个概念对于万维网之前的大多数超文本系统来说是陌生的。 某些资源是静态的,即在创建后的任何时间检查它们时,它们始终对应于相同的值集。其他的则随着时间的推移在其价值方面存在高度差异。 唯一要求资源是静态的就是映射的语义,因为语义是一种资源与另一种资源的区别。

      例如,一篇学术论文的“作者首选版本”是一个值随时间变化的映射,而“在 X 会议论文集中发表的论文”的映射是静态的。 这是两个不同的资源,即使它们在某个时间点都映射到相同的值。区分是必要的,以便可以独立识别和引用这两种资源。软件工程中的一个类似示例是在引用“最新修订版”、“修订版号 1.2.7”或“Orange 版本中包含的修订版”时单独标识受版本控制的源代码文件。 [...]

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-19
        • 1970-01-01
        • 1970-01-01
        • 2012-08-26
        • 2018-08-23
        • 1970-01-01
        相关资源
        最近更新 更多