57

什么是 REST 资源,它们与资源名称和资源表示有什么关系?

我读了几篇关于这个主题的文章,但它们太抽象了,让我比以前更加困惑。

以下 URL 是资源吗?如果是,该资源的名称是什么,它的表示是什么?

http://api.example.com/users.json?length=2&offset=5

URL 的 GET 响应应该类似于:

[
   {
      id: 6,
      name: "John"
   },
   {
      id: 7,
      name: "Jane"
   }
]
4

11 回答 11

46

REST 资源的文章之所以抽象,是因为 REST 资源的概念抽象的。它基本上是“您提供的 URL 访问的任何内容”。因此,在您的示例中,资源将是从某个更大列表中的偏移量 5 开始的两个用户的列表。请注意,资源的实现方式是您不关心的细节,除非您是编写实现的人。

以下 URL 是资源吗?

URL 不是资源,它是标识资源的标签,如果您愿意,它是资源的名称。

JSON 是资源的表示

于 2012-05-29T12:46:16.377 回答
34

什么是资源?

资源是任何重要到足以被作为事物本身引用的东西。如果您的用户可能“想要创建指向它的超文本链接,做出或反驳关于它的断言,检索或缓存它的表示,通过引用将其全部或部分包含到另一个表示中,注释它,或对其执行其他操作”,那么您应该将其设为资源。

通常,资源是可以存储在计算机上并表示为比特流的东西:文档、数据库中的一行或运行算法的结果。资源可能是像苹果这样的物理对象,或者是像勇气这样的抽象概念,但是(正如我们稍后将看到的)这些资源的表示必然会令人失望。以下是一些可能的资源:

  • 软件版本 1.0.3 版
  • 最新版本的软件版本
  • 2006 年 10 月 24 日的第一个博客条目
  • 阿肯色州小石城的路线图
  • 关于水母的一些信息
  • 与水母有关的资源目录
  • 1024之后的下一个素数
  • 1024 之后的五个素数
  • Q42004的销售数字
  • 两个熟人 Alice 和 Bob 之间的关系
  • 错误数据库中打开的错误列表

文本来自 O'Reilly 的书“ RESTful Web Services ”。

于 2012-06-04T15:23:24.297 回答
17

URL 绝不是资源或其名称或表示。

URL 只是告诉资源所在的位置,您可以在此 URL 上调用 GET、POST、PUT、DELETE 等来调用资源。

返回的数据是资源,而数据的形式是它的表示。

假设您的带有给定 GET 参数的 URL 可以输出 JSON 资源 - 这是该资源的 JSON 表示。虽然在 GET 中使用其他标志,但它可以使用 XML 中的相同数据进行响应——这将是相同资源的另一种表示。

编辑:由于对 OP 的评论和我的回答,我正在添加另一个解释。

资源名称也被认为是“脚本名称”,例如,在这种情况下,users.json当这个资源名称是自描述资源表示本身时——当调用这个资源时,我们期望资源是 JSON 格式,而在调用时,例如users.xml我们会期望 XML 中的数据。

  1. 当我更改offsetGET 中的参数时,响应包含不同的数据集 - 它是新资源还是它的表示?
  2. 当我在 GET 中定义作为响应返回的列时,它是不同的资源还是不同的表示形式,还是?
  1. 好吧,这里的问题和答案很清楚 - 我们仍然调用相同的 URL,服务器以相同的形式响应数据(仍然是 JSON),数据仍然包含有关用户的信息 - 只是信息本身由于新的偏移参数。所以很明显,它仍然是同一个资源,具有相同的表示和相同的资源名称
  2. 第二个问题可能有点令人困惑。尽管我们调用的是相同的资源,但该资源包含相同的数据(仅具有预定义的列集),并且尽管数据具有相同的表示形式,但在我们看来它可能是不同的资源。但是由于上面段落中的要点,它也不是不同的资源或不同的表示。尽管数据集包含的信息较少,但请求方(过滤此数据集)应该考虑这一点并采取相应的行动。再说一遍:它是具有相同资源名称和相同资源表示的相同资源
于 2012-05-29T12:48:05.520 回答
15

休息

这种建筑风格在Roy T. Fielding 的论文第 5 章中定义。

REST 是关于通过它们在客户端和服务器之间的无状态通信之上的表示来操纵资源状态的。它是一种独立于协议的架构风格,但在实践中,它通常在 HTTP 协议之上实现。

资源

资源本身是一种抽象,用作者的话来说,资源可以是任何可以命名的信息。应用程序的域实体(例如人、用户、发票、发票集合等)可以是资源。请参阅菲尔丁论文中的以下引用:

5.2.1.1 资源和资源标识符

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

更准确地说,资源R是一个随时间变化的隶属函数M R (t),它在时间 t 映射到一组等效的实体或值。集合中的值可以是资源表示和/或资源标识符。[...]

资源表示

JSON 文档是一种资源表示,允许您表示资源的状态。服务器可以为同一资源提供不同的表示。例如,使用 XML 和 JSON 文档。客户端可以使用内容协商来请求同一资源的不同表示。

引用菲尔丁的论文:

5.2.1.2 表示

REST 组件通过使用表示来捕获该资源的当前或预期状态并在组件之间传输该表示来对资源执行操作。表示是一个字节序列,加上描述这些字节的表示元数据。其他常用但不太精确的表示名称包括:文档、文件和 HTTP 消息实体、实例或变体。

表示包括数据、描述数据的元数据,有时还包括描述元数据的元数据(通常用于验证消息完整性)。元数据采用名称-值对的形式,其中名称对应于定义值的结构和语义的标准。响应消息可能包括表示元数据和资源元数据:关于资源的信息,不特定于所提供的表示。[...]

通过 HTTP,请求和响应标头可用于交换有关表示的元数据。

资源标识符

URL 是一种资源标识符,用于标识/定位服务器中的资源。


这个答案可能也很有见地。

于 2017-11-22T13:48:58.420 回答
13

什么是 REST 资源,它们与资源名称和资源表示有什么关系?

REST 并不意味着你正确使用 HTTP 动词(GET、POST、PUT、DELETE 等)。

以下 URL 是资源吗?

所有 URL 都是字符串,告诉计算机可以找到资源的位置。(因此得名:统一资源定位器)。

于 2012-05-29T12:37:19.520 回答
7

一个资源是:

  • 一个名词
  • 那是独一无二的
  • 并且可以表示为数据
  • 并且至少有一个 URI

我在我的博客文章中更详细地介绍了 RESTful 资源到底是什么?

于 2014-06-15T19:07:55.100 回答
5

从概念上讲,您可以将资源视为可以使用 URL 在 Web 上访问的所有内容。如果你坚持这个规则http://api.example.com/users.json?length=2&offset=5可以被认为是一种资源

于 2012-05-29T12:38:44.620 回答
4

Representational State Transfer (REST) 是一种用于分布式系统(如万维网)的软件架构风格。REST 风格的架构由客户端和服务器组成。客户端向服务器发起请求;服务器处理请求并返回适当的响应。请求和响应是围绕资源表示的传输构建的。资源是一组可寻址对象,基本上是文件和文档,使用 URL 链接。正如 Quentin 上面正确指出的那样,REST 架构仅意味着您将使用 HTTP 动词 GET/POST/PUT/DELETE...

于 2012-05-29T12:49:29.090 回答
2

您只提供了看似相对的参数,而不是(或应该)具体的“ID”。请记住,get 操作应该是幂等的(即可重复并具有相同的结果)。

于 2012-05-29T12:37:47.380 回答
1

什么是 REST?

REST 是一种架构风格,代表 Representational(RE) State(S) transfer(T)。

什么是 REST 资源?

休息资源是我们要对其执行操作的数据。因此,这些数据可以作为表的记录或任何其他形式存在于数据库中。该记录具有唯一标识符,可以用它来识别像员工的 id。

现在,当这个数据被唯一的 url 请求时,比如http://www.example.com/employees/123,所以最终存在于数据库中的数据或记录将被 Rest Service 转换为 JSON/XML/纯文本格式,并将发送给消费者。

所以基本上,这里发生的是代表状态转移,以一种方式将数据库中存在的数据状态转移到另一种格式,可以是 JSON/XML 或纯文本。

因此,在这种情况下,1 个员工代表 1 个资源,可以通过唯一的 url 访问,例如http://www.example.com/employees/123

如果我们想获取所有资源(员工)的列表,我们会这样做: http ://www.example.com/employees

希望这会有所帮助。

于 2017-08-20T13:42:18.803 回答
-3

REST 代表代表性状态转移。这是一种将可变信息从一个位置传输到另一个位置的方法。执行此操作的常用方法是使用 JSON - 一种格式化变量的方法,以便可以在不丢失信息的情况下传输它们。

例如,PHP 已经内置了 JSON 支持。将 PHP 数组传递给json_encode($array)将输出您发布的格式的字符串(顺便说一下,这确实是一个 REST 资源,因为它为您提供了变量和信息)。

在 PHP 中,您发布的数组将变成:

Array (

    [0]=>Array (
        ['id']=>6;
        ['name']=>'John';
    )
    [1]=>Array (
        ['id']=>7;
        ['name']=>'Jane';
    )

)
于 2012-05-29T12:35:49.663 回答