REST中的资源和资源表示有什么区别?

use*_*625 3 xml rest json

我是REST新手,刚开始阅读一些教程.

让我感到困惑的一件事是:txt/xml/json形式的内容:资源还是资源表示?必须是后者,对吗?由于资源可以是视频,音频或其他MIME类型.

以下面的例子为例.假设我给出的描述类似于"RESTful服务,其中User是使用以下XML格式表示的资源":

<user>
   <id>1</id>
   <name>Mahesh</name>
   <profession>Teacher</profession>
</user>
Run Code Online (Sandbox Code Playgroud)

或JSON格式:

{
   "id":1,
   "name":"Mahesh",
   "profession":"Teacher"
}
Run Code Online (Sandbox Code Playgroud)

然后,当我使用HTTP GET访问资源时,我实际上会得到什么数据?我得到'1,Mahesh,老师',因为这是排除格式的真实数据,还是我得到包含数据和数据表示的整个xml或json'对象'?

如果用户有图像属性怎么办?HTTP将什么样的"包"以及以何种形式提供给我:图像本身或图像的链接?

编辑

另一个例子:

http://maps.googleapis.com/maps/api/geocode/xml?address=1600+Amphitheatre+Parkway,+Mountain+View,+CA&sensor=false

我应该理解返回的资源本身是XML文件,或者资源不是XML文件,但是嵌入在XML资源表示中的一些数据是?

如果我想要的资源包含图像,视频等怎么办?那些不是可以嵌入XML或JSON格式的文本数据 - 在这种情况下,我得到了什么?

cas*_*lin 10

资源

REST资源的概念是抽象的,您可以将其理解为由服务器提供的URL标识的内容.

资源可以是用户,用户列表,客户,文件或应用程序的任何实体.

例如,将用户视为具有以下属性和值的资源:

  • ID:1
  • 名字:约翰
  • 姓氏:Doe
  • 电子邮件:john.doe@example.com

网址

URL(统一资源定位器)只是标识资源,也就是,其中的资源位于服务器.

例如,当URL /app/users/1使用ID查找用户时1,URL会/app/users找到应用程序中的所有用户.

HTTP方法

REST协议无关,但是,如果你正在使用HTTP,您可以在资源存取与HTTP方法,如URL执行操作GET,POST,PUTDELETE.

例如,当您GET对URL 执行a时/app/users/1,您将获得具有ID的用户的表示1.

资源代表

资源可以用多种格式表示,例如JSON,XML,YAML等.

在JSON中,表示形式为:

{
    "id": 1,
    "firstName": "John",
    "lastName": "Doe",
    "email": "john.doe@example.com"
}
Run Code Online (Sandbox Code Playgroud)

在XML中,表示形式如下:

<user>
    <id>1</id>
    <firstName>John</firstName>
    <lastName>Doe</lastName>
    <email>john.doe@example.com</email>
</user>
Run Code Online (Sandbox Code Playgroud)

例1

考虑您正在使用JavaScript开发应用程序,并且服务器可以将资源表示为JSON和XML.在JavaScript应用程序中处理JSON而不是XML更容易.因此,您希望表示为JSON的资源.

为此,在GET对URL 执行操作时/app/users/1,您将添加Accept带有application/json值的HTTP标头,以告知服务器客户端接受的表示形式.

因此,服务器将返回表示为JSON的资源.响应将包含Content-Type带有application/json值的标头,指示响应的内容是JSON.


例2

例如,除了JSON和XML之外,资源可以表示为图像或视频.

考虑其定位用户的个人资料图片的URL: /app/users/1/profile-picture.

根据图像的类型,Content-Type该响应将是image/jpeg,image/png,image/gif,等.


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


Pau*_*tha 5

这是 REST 教父 Roy T. Fielding 的话(摘自他的论文

§ 5.2.1.1 资源和资源标识符

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

真正的资源可以是抽象的概念,可以通过 URI 进行识别,并且可以用可传输的数据来表示。

§ 5.2.1.2 陈述

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

[...]

表示的数据格式称为媒体类型。表示可以包含在消息中,并由接收者根据消息的控制数据和媒体类型的性质进行处理。

所以真正的表示是表示资源的数据(或状态)。

表示的数据格式在形式上是媒体类型,但您也可能听说它被称为变体。

每个对 REST 感兴趣的人,至少应该阅读该论文的第 5 章。毕竟,这就是 REST 的诞生方式。