REST资源是什么?

65
什么是REST资源?它们与资源名称和资源表示有何关系?
我阅读了一些相关文章,但它们过于抽象,让我比之前更加困惑。
以下URL是否为资源?如果是,那么该资源的名称和表示是什么?

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

URL的GET响应应该是这样的:
[
   {
      id: 6,
      name: "John"
   },
   {
      id: 7,
      name: "Jane"
   }
]

似乎是用户的JSON表示形式... - Esailija
这是否意味着资源名称是 users - Emanuil Rusev
@Esailija,我们可以假设资源只是在特定URI上访问的一些数据的表示。它们就像URI和数据物理位置之间的抽象和连接。 - Haralan Dobrev
在我之前回答不同问题时,有一些例子(https://dev59.com/mm455IYBdhLWcg3wCfmC#4573426)。我记得当时我有点难以理解REST应该如何工作。 - zzzzBov
这里非常清楚地解释了什么是资源:https://restful-api-design.readthedocs.org/en/latest/resources.html - Paolo
显示剩余3条评论
11个回答

54

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

以下URL是否是资源?

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

JSON是资源的表示


7
基本上,URL 是你想使用的资源所在的终点。 - Yago Riveiro
我应该如何称呼“用户”?说“用户”是资源的数据类型是否正确? - Emanuil Rusev
严格来说,“users”只是URL的一部分。它不一定有任何意义。当然,在现实中,您知道它是应用程序数据模型的一部分。 - JeremyP

38

什么是资源?

资源是任何重要到足以被引用为一个独立物体的东西。如果你的用户可能“想要创建超文本链接、对其进行断言、检索或缓存其表示形式、将其全部或部分地引用到另一个表示形式中、注释它或执行其他操作”,那么你应该将其作为资源。

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

  • 软件发布版本1.0.3
  • 软件发布的最新版本
  • 2006年10月24日的第一篇博客文章
  • 阿肯色州小岩城市地图
  • 有关水母的一些信息
  • 与水母相关的资源目录
  • 1024之后的下一个质数
  • 1024之后的下五个质数
  • Q42004的销售数字
  • 两个熟人Alice和Bob之间的关系
  • 缺陷数据库中的未解决缺陷列表
这段文字来自O'Reilly书籍"RESTful Web Services"。

17

URL并不是资源本身、其名称或其表示。

URL只是指示资源所在的位置,您可以对此URL进行GET、POST、PUT、DELETE等操作来调用资源。

响应的数据是资源,而数据的形式是它的表示。

比如说,您带有给定GET参数的URL可以输出JSON资源 - 这是这个资源的JSON表示。而使用GET中的其他标志,则会以XML的形式响应相同的数据 - 这将是同一资源的另一种表示。

编辑:由于对OP和我的回答的评论,我添加了其他解释。

此外,资源名称被认为是'脚本名称',例如在这种情况下它是users.json,而当调用此资源时,资源名称本身描述了资源表示 - 当我们调用此资源时,我们期望资源以JSON格式呈现,而当调用例如users.xml时,我们将期望数据以XML格式显示。

  1. 当我在GET中更改offset参数时,响应包含不同的数据集 - 这是一个新资源还是它的表示?
  2. 当我在GET响应中定义返回的列时,这是不同的资源还是不同的表示,或者是其他什么?
  1. 好的,这里的问题和答案很明确 - 我们仍然调用相同的URL,服务器以相同的形式响应数据(仍然是JSON),数据仍然包含关于用户的信息 - 只是由于新的偏移参数而更改了信息本身。因此,它仍然是与之前相同的资源、相同的表示和相同的资源名称
  • 第二个问题可能有点令人困惑。虽然我们调用的是同一个资源,虽然该资源包含相同的数据(只是预定义的列集),而且数据以相同的方式表示,但它在我们看来可能会变成不同的资源。但由于上面段落中的要点,它既不是不同的资源,也不是不同的表示。虽然数据集包含的信息较少,但请求方(过滤此数据集)应该考虑到这一点并相应地行事。因此,再次强调:这是具有相同资源名称和相同资源表示的同一资源

  • 1
    如果您有一个GET参数字段,允许您限制列出给定数据集的属性。例如:http://api.example.com/users/123?fields[]=id&fields[]=email那么: 这是一个不同的资源吗? 这是一个不同的表示形式吗? 还是其他什么东西? - Haralan Dobrev
    1
    表示形式相同,资源也相同,但提供了不同的数据集 - 但仍包含用户数据,仍然以相同的数据格式。因此对于您的前两个问题是“否”,对于您的第三个问题,“它是具有相同表示的相同资源”。 - shadyyx

    17

    REST

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

    REST是通过客户端和服务器之间无状态通信,在其表示形式上对资源状态进行操作的。它是一种独立于协议的架构风格,但在实践中,通常在HTTP协议的基础上实现。

    资源

    资源本身是一种抽象概念,并且按照作者的说法,资源可以是任何可以命名的信息。应用程序的领域实体(例如人、用户、发票、发票集合等)可以是资源。请参阅Fielding论文中的以下引用:

    5.2.1.1 资源和资源标识符

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

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

    资源表示

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

    引用 Fielding 的论文:

    5.2.1.2 表示

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

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

    在HTTP中,请求和响应头可以用于交换有关表示的元数据。

    资源标识符

    URL是服务器中标识/定位资源的资源标识符


    这个answer也许会很有启发性。


    14

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

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

    以下URL是否为资源?

    所有的URL都是字符串,告诉计算机资源位于何处(因此称为统一资源定位符)。


    1
    REST是一种基于HTTP协议的Web服务架构风格,它强调使用统一接口来访问和操作资源。简而言之,REST是一种设计原则,旨在使Web应用程序更加灵活、可扩展和易于维护。通过使用REST,开发人员可以创建具有高度可靠性、可伸缩性和安全性的Web服务。 - verisimilitude
    REST不需要HTTP。HTTP只是传输协议。使用HTTP动词只是在REST over HTTP之上的一种覆盖。 - Justin Ohms

    7
    一个资源是:
    • 一个名词
    • 具有唯一性
    • 可以表示为数据
    • 至少有一个URI。

    我在我的博客文章中详细介绍了这个概念:什么是RESTful资源?


    GET/POST/PUT或Patch/DELETE是名词吗? - muneeb_ahmed
    @muneeb_ahmed,它们是动词,而不是名词。根据剑桥词典,名词的意思是:指人、地方、事物、事件、物质或品质的词语。名词的例子包括:桌子行为工具所有者等。 - nav
    那个链接不再可用。 - t3chb0t

    5

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


    我应该如何称呼“用户”?说“用户”是资源的数据类型是否正确? - Emanuil Rusev
    从概念上讲,这是不正确的。例如,图像可以是资源"http:://MyApplication/User/Image.jpg",那么数据类型是什么?希望这有意义。 - Massimiliano Peluso
    那么我应该如何引用“用户”?接受Image.jpg是“image”类型不是很合理吗? - Emanuil Rusev
    这只是URL的一部分,就像image.jpg一样,你可以将其视为资源的名称。 - Massimiliano Peluso
    1
    我需要一种方式来引用它。我想要区分/users,它检索多个项目,和/users/123,它检索一个项目。 - Emanuil Rusev
    显示剩余2条评论

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

    2

    您提供的似乎只是相对参数,而不是具体的“ID”参数。请记住,获取操作应该是幂等的(即使用相同的结果可重复执行)。


    1

    什么是REST?

    REST是一种架构风格,代表着表征性(RE)状态(S)转移(T)。

    什么是REST资源?

    REST资源是我们想要执行操作的数据。因此,这些数据可以作为表格记录或以其他形式存在于数据库中。该记录具有唯一标识符,例如Employee的ID。

    当使用唯一的URL请求此数据时,例如http://www.example.com/employees/123,最终Rest服务将把数据库中存在的数据或记录转换为JSON/XML/普通文本格式,并发送给消费者。

    因此,基本上在这里发生的是表征性状态转移,以一种方式将存在于数据库中的数据的状态转移到可以是JSON/XML或普通文本的另一种格式。

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

    如果我们想要获取所有资源(员工)的列表,我们将会执行以下操作: http://www.example.com/employees 希望这能有所帮助。

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接