关于http:RESTful编程究竟是什么?

What exactly is RESTful programming?

RESTful编程到底是什么?


REST是Web的基础架构原则。Web的惊人之处在于,客户机(浏览器)和服务器可以以复杂的方式进行交互,而客户机不必事先了解服务器及其承载的资源。关键限制是服务器和客户机必须在所使用的媒体上达成一致,在Web的情况下,这是HTML。

遵循REST原则的API不需要客户机了解API的结构。相反,服务器需要提供客户机与服务交互所需的任何信息。HTML表单就是这样一个例子:服务器指定资源的位置和必需的字段。浏览器不预先知道在哪里提交信息,也不预先知道要提交什么信息。这两种形式的信息都完全由服务器提供。(这一原则被称为hateoas:作为应用程序状态引擎的超媒体。)

那么,这如何应用于HTTP,以及如何在实践中实现它?HTTP面向动词和资源。主流用法中的两个动词是GETPOST,我认为大家都会认识。但是,HTTP标准定义了其他几个标准,如PUTDELETE。然后,根据服务器提供的说明,将这些动词应用到资源中。

例如,假设我们有一个由Web服务管理的用户数据库。我们的服务使用基于JSON的自定义超媒体,为此我们分配mimetype application/json+userdb(也可能有application/xml+userdbapplication/whatever+userdb——可能支持多种媒体类型)。客户机和服务器都被编程为理解这种格式,但它们彼此不了解任何信息。正如罗伊·菲尔丁指出的那样:

A REST API should spend almost all of its descriptive effort in
defining the media type(s) used for representing resources and driving
application state, or in defining extended relation names and/or
hypertext-enabled mark-up for existing standard media types.

对基础资源/的请求可能返回如下内容:

请求

1
2
GET /
Accept: application/json+userdb

响应

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
200 OK
Content-Type: application/json+userdb

{
   "version":"1.0",
   "links": [
        {
           "href":"/user",
           "rel":"list",
           "method":"GET"
        },
        {
           "href":"/user",
           "rel":"create",
           "method":"POST"
        }
    ]
}

我们从媒体的描述中知道,我们可以从"链接"部分找到有关资源的信息。这叫做超媒体控制。在这种情况下,我们可以从这样一个部分看出,我们可以通过对/user提出另一个请求来找到用户列表:

请求

1
2
GET /user
Accept: application/json+userdb

响应

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
200 OK
Content-Type: application/json+userdb

{
   "users": [
        {
           "id": 1,
           "name":"Emil",
           "country:"Sweden",
           "links": [
                {
                   "href":"/user/1",
                   "rel":"self",
                   "method":"GET"
                },
                {
                   "href":"/user/1",
                   "rel":"edit",
                   "method":"PUT"
                },
                {
                   "href":"/user/1",
                   "rel":"delete",
                   "method":"DELETE"
                }
            ]
        },
        {
           "id": 2,
           "name":"Adam",
           "country:"Scotland",
           "links": [
                {
                   "href":"/user/2",
                   "rel":"self",
                   "method":"GET"
                },
                {
                   "href":"/user/2",
                   "rel":"edit",
                   "method":"PUT"
                },
                {
                   "href":"/user/2",
                   "rel":"delete",
                   "method":"DELETE"
                }
            ]
        }
    ],
   "links": [
        {
           "href":"/user",
           "rel":"create",
           "method":"POST"
        }
    ]
}

我们可以从这个回答中看出很多。例如,我们现在知道可以通过POST/user创建一个新用户:

请求

1
2
3
4
5
6
7
8
POST /user
Accept: application/json+userdb
Content-Type: application/json+userdb

{
   "name":"Karl",
   "country":"Austria"
}

响应

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
201 Created
Content-Type: application/json+userdb

{
   "user": {
       "id": 3,
       "name":"Karl",
       "country":"Austria",
       "links": [
            {
               "href":"/user/3",
               "rel":"self",
               "method":"GET"
            },
            {
               "href":"/user/3",
               "rel":"edit",
               "method":"PUT"
            },
            {
               "href":"/user/3",
               "rel":"delete",
               "method":"DELETE"
            }
        ]
    },
   "links": {
      "href":"/user",
      "rel":"list",
      "method":"GET"
    }
}

我们还知道,我们可以更改现有数据:

请求

1
2
3
4
5
6
7
8
PUT /user/1
Accept: application/json+userdb
Content-Type: application/json+userdb

{
   "name":"Emil",
   "country":"Bhutan"
}

响应

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
200 OK
Content-Type: application/json+userdb

{
   "user": {
       "id": 1,
       "name":"Emil",
       "country":"Bhutan",
       "links": [
            {
               "href":"/user/1",
               "rel":"self",
               "method":"GET"
            },
            {
               "href":"/user/1",
               "rel":"edit",
               "method":"PUT"
            },
            {
               "href":"/user/1",
               "rel":"delete",
               "method":"DELETE"
            }
        ]
    },
   "links": {
      "href":"/user",
      "rel":"list",
      "method":"GET"
    }
}

请注意,我们正在使用不同的HTTP动词(GETPUTPOSTDELETE等)来操纵这些资源,而我们对客户方所假定的唯一知识是我们的媒体定义。

进一步阅读:

  • 在这一页上有很多更好的答案。
  • 我如何向我妻子解释休息。
  • 我如何向我妻子解释休息。
  • Martin Fowler思想
  • PayPal的API具有超媒体控件

(这一回答因遗漏了要点而受到了相当多的批评。在很大程度上,这是一个公平的批评。我最初描述的更符合几年前我第一次写这篇文章时REST通常是如何实现的,而不是它的真正含义。我修改了答案,以便更好地表达真实的含义。)


一种称为REST(代表性状态转移)的体系结构风格主张Web应用程序应该像最初设想的那样使用HTTP。查找应使用GET请求。PUTPOSTDELETE请求分别用于突变、创建和删除。

REST支持者倾向于使用URL,例如

1
http://myserver.com/catalog/item/1729

但是,其余的体系结构不需要这些"漂亮的URL"。带有参数的GET请求

1
http://myserver.com/catalog?item=1729

一切都那么安逸。

请记住,GET请求不应用于更新信息。例如,将项目添加到购物车的GET请求

1
http://myserver.com/addToCart?cart=314159&item=1729

不合适。GET请求应该是等幂的。也就是说,发出两次请求和发出一次请求应该没有什么不同。这就是使请求可缓存的原因。"添加到购物车"请求不是等量的,发出两次请求会将项目的两个副本添加到购物车。在这种情况下,发布请求显然是合适的。因此,即使是一个RESTful的Web应用程序也需要它的POST请求份额。

这是摘自大卫·M·盖瑞的优秀著作《核心JavaServer Faces》。


RESTful编程是关于:

  • 由持久标识符标识的资源:目前,URI是无处不在的标识符选择
  • 使用一组常见的动词来操纵资源:HTTP方法是常见的情况——受人尊敬的CreateRetrieveUpdateDelete变成POSTGETPUTDelete。但REST不局限于HTTP,它只是目前最常用的传输。
  • 为资源检索的实际表示依赖于请求而不是标识符:使用Access标头来控制是否需要XML、HTTP或甚至代表资源的Java对象。
  • 在对象中维护状态并在表示中表示状态
  • 表示资源表示中资源之间的关系:对象之间的链接直接嵌入表示中
  • 资源表示描述如何使用表示,以及在什么情况下应以一致的方式丢弃/重新蚀刻表示:HTTP缓存控制头的使用

最后一个可能是在后果和休息的整体效果方面最重要的。总的来说,大多数RESTful的讨论似乎都集中在HTTP及其在浏览器中的使用以及其他方面。我知道R.Fielding在描述导致HTTP的体系结构和决策时创造了这个术语。与HTTP相比,本文更关注资源的体系结构和缓存能力。

如果你真的对一个宁静的建筑是什么以及为什么它能工作感兴趣的话,可以读几遍他的论文,并阅读整个内容,而不仅仅是第5章!下一步研究DNS工作的原因。请阅读有关DNS的分层组织以及引用如何工作的信息。然后阅读并考虑DNS缓存是如何工作的。最后,阅读HTTP规范(特别是rfc2616和rfc3040),并考虑缓存如何以及为什么以这种方式工作。最终,它只会点击。对我来说,最后的启示是当我看到dns和http之间的相似性时。在这之后,了解SOA和消息传递接口为什么是可伸缩的开始点击。

我认为理解RESTful和无共享体系结构的体系结构重要性和性能影响的最重要技巧是避免被技术和实现细节所困扰。专注于谁拥有资源,谁负责创建/维护资源等,然后考虑表示、协议和技术。


这就是它可能的样子。

创建具有三个属性的用户:

1
2
POST /user
fname=John&lname=Doe&age=25

服务器响应:

1
2
200 OK
Location: /user/123

以后,您可以检索用户信息:

1
GET /user/123

服务器响应:

1
2
200 OK
<fname>John</fname><lname>Doe</lname>25</age>

要修改记录(lnameage将保持不变):

1
2
PATCH /user/123
fname=Johnny

要更新记录(因此,lnameage将为空):

1
2
PUT /user/123
fname=Johnny


一本关于休息的好书就是实践中的休息。

必须读取是表示状态传输(REST),并且RESTAPI必须是超文本驱动的

请参阅MartinFowlers文章Richardson成熟度模型(RMM),了解关于什么是RESTful服务的解释。

Richardson Maturity Model

为了保证服务的安全,需要将超媒体作为应用程序状态的引擎来实现。(hateoas),也就是说,它需要达到RMM中的3级,阅读文章了解细节或Qcon谈话的幻灯片。

The HATEOAS constraint is an acronym
for Hypermedia as the Engine of
Application State. This principle is
the key differentiator between a REST
and most other forms of client server
system.

...

A client of a RESTful application need
only know a single fixed URL to access
it. All future actions should be
discoverable dynamically from
hypermedia links included in the
representations of the resources that
are returned from that URL.
Standardized media types are also
expected to be understood by any
client that might use a RESTful API.
(From Wikipedia, the free encyclopedia)

Web框架的rest-litmus测试与Web框架的成熟度测试类似。

接近纯粹的休息:学习爱恨恶是一个很好的链接集合。

针对公共云的REST与SOAP讨论了当前的REST使用级别。

REST和版本控制讨论了可扩展性、版本控制、可演化性等。通过可修改性


What is REST?

REST stands for Representational State Transfer. (It is sometimes
spelled"ReST".) It relies on a stateless, client-server, cacheable
communications protocol -- and in virtually all cases, the HTTP
protocol is used.

REST is an architecture style for designing networked applications.
The idea is that, rather than using complex mechanisms such as CORBA,
RPC or SOAP to connect between machines, simple HTTP is used to make
calls between machines.

In many ways, the World Wide Web itself, based on HTTP, can be viewed
as a REST-based architecture. RESTful applications use HTTP requests
to post data (create and/or update), read data (e.g., make queries),
and delete data. Thus, REST uses HTTP for all four CRUD
(Create/Read/Update/Delete) operations.

REST is a lightweight alternative to mechanisms like RPC (Remote
Procedure Calls) and Web Services (SOAP, WSDL, et al.). Later, we will
see how much more simple REST is.

Despite being simple, REST is fully-featured; there's basically
nothing you can do in Web Services that can't be done with a RESTful
architecture. REST is not a"standard". There will never be a W3C
recommendataion for REST, for example. And while there are REST
programming frameworks, working with REST is so simple that you can
often"roll your own" with standard library features in languages like
Perl, Java, or C#.

当我试图找到休息的简单真正意义时,我发现了一个最好的参考。

http://rest.elkstein.org网站/


REST使用各种HTTP方法(主要是get/put/delete)来操作数据。

不是使用特定的URL来删除方法(例如,/user/123/delete),而是向/user/[id]URL发送删除请求,编辑用户,检索发送get请求给/user/[id]的用户的信息。

例如,取而代之的是一组URL,它们可能看起来像下面的一些。

1
2
3
4
5
6
GET /delete_user.x?id=123
GET /user/delete
GET /new_user.x
GET /user/new
GET /user?id=1
GET /user/id/1

使用http"verbs"并使用..

1
2
3
GET /user/2
DELETE /user/2
PUT /user


这是一个程序设计,你的系统架构符合罗伊·菲尔丁在他的论文中提出的休息风格。因为这是描述网络的架构风格(或多或少),所以很多人都对它感兴趣。

奖励答案:没有。除非你正在学习软件架构作为学术或设计Web服务,否则真的没有理由听过这个词。


如果我没有直接回答这个问题,我很抱歉,但是通过更详细的例子更容易理解这一切。由于所有的抽象和术语,字段化并不容易理解。

这里有一个很好的例子:

解释REST和超文本:垃圾邮件清理机器人

更棒的是,这里有一个简单的例子解释清楚(PowerPoint更全面,但您可以在HTML版本中获得大部分内容):

http://www.xfront.com/rest.ppt或http://www.xfront.com/rest.html

在阅读了这些例子之后,我明白了为什么肯说REST是超文本驱动的。不过,我并不确定他是否正确,因为/user/123是一个指向资源的URI,我也不清楚,它之所以没有效果,仅仅是因为客户端"带外"知道它。

XFront文档解释了REST和SOAP之间的区别,这也非常有用。当菲尔丁说,"那是RPC。它尖叫着"rpc",很明显,rpc是不可休息的,所以看到确切的原因是很有用的。(SOAP是一种RPC。)


我会说RESTful编程是关于创建遵循REST体系结构风格的系统(API)。

我发现M.Elkstein博士的这篇关于休息的精彩、简短且易于理解的教程,并引用了最基本的部分来回答您的问题:

学习休息:教程

REST is an architecture style for designing networked applications.
The idea is that, rather than using complex mechanisms such as CORBA,
RPC or SOAP to connect between machines, simple HTTP is used to make
calls between machines.

  • In many ways, the World Wide Web itself, based on HTTP, can be viewed as a REST-based architecture.

RESTful applications use HTTP requests to post data (create and/or
update), read data (e.g., make queries), and delete data. Thus, REST
uses HTTP for all four CRUD (Create/Read/Update/Delete) operations.

我认为你不应该因为没有听到堆栈溢出之外的休息而感到愚蠢…,我会处于同样的情况!回答另一个问题,为什么现在休息变得更大可以缓解一些感觉。


休息是什么?

用官方的话说,REST是一种基于某些原则的架构风格,使用当前的"Web"基本原理。Web有5个基本原理,用于创建REST服务。

  • 原则1:一切都是资源在REST体系结构样式中,数据和功能被视为资源,并使用统一资源标识符(URI)访问,通常是Web上的链接。
  • 原则2:每个资源都由唯一标识符(URI)标识。
  • 原则3:使用简单统一的接口
  • 原则4:通过代表进行沟通
  • 原则5:无状态


我看到了一堆答案,它们说将用户123的所有内容放在资源"/user/123"上是可以休息的。

RoyFielding创造了这个术语,他说RESTAPI必须是超文本驱动的。特别是,"RESTAPI不能定义固定的资源名称或层次结构"。

因此,如果您的"/user/123"路径是硬编码在客户机上的,那么它就不是真正的RESTful。很好地使用HTTP,也许,也许不是。但不能休息。它必须来自超文本。


答案很简单,有一篇由罗伊·菲尔丁写的论文。]1在这篇论文中,他定义了其余的原则。如果一个应用程序满足所有这些原则,那么它就是一个REST应用程序。好的。

之所以创建restful一词,是因为PPL通过将非rest应用程序调用为rest耗尽了单词rest。在那之后,restful这个词也被耗尽了。现在我们讨论的是Web API和超媒体API,因为大多数所谓的REST应用程序都没有满足统一接口约束的hateoas部分。好的。

其余约束如下:好的。

  • 客户机-服务器体系结构好的。

    所以它不适用于pub/sub套接字,它基于req/rep。好的。

  • 无状态通信好的。

    所以服务器不维护客户机的状态。这意味着您不能使用服务器端会话存储,必须对每个请求进行身份验证。您的客户机可能通过加密连接发送基本的认证头。(对于大型应用程序,很难维护许多会话。)好的。

  • 如果可以,使用缓存好的。

    所以你不必一次又一次地满足同样的要求。好的。

  • 统一接口作为客户机和服务器之间的公共契约好的。

    客户机和服务器之间的契约不由服务器维护。换句话说,客户机必须与服务的实现分离。您可以通过使用标准解决方案(如IRI(URI)标准来标识资源、HTTP标准来交换消息、标准的mime类型来描述主体序列化格式、元数据(可能是RDF词汇、微格式等)来描述消息主体不同部分的语义来达到这种状态。要将IRI结构与客户机分离,必须以超媒体格式(HTML、JSON-LD、HAL等)向客户机发送超链接。因此,客户机可以使用分配给超链接的元数据(可能是链接关系、RDF词汇),通过适当的状态转换来导航应用程序的状态机,以实现其当前目标。好的。型

    例如,当一个客户机想要向一个webshop发送一个订单时,它必须检查webshop发送的响应中的超链接。通过检查链接,它找到了一个用http://schema.org/orderaction描述的链接。客户机知道schema.org词汇表,因此它了解通过激活这个超链接,它将发送订单。所以它激活了超链接,并用适当的主体发送一条POST https://example.com/api/v1/order消息。之后,服务处理消息并使用具有适当HTTP状态头的结果作出响应,例如成功地执行201 - created。要用详细的元数据注释消息,使用RDF格式的标准解决方案,例如JSON-LD和REST词汇,例如hydra和领域特定词汇,如schema.org或任何其他链接数据词汇,如果需要,还可以使用自定义应用程序特定词汇。现在这并不容易,这就是为什么大多数PPL使用HAL和其他简单格式的原因,这些格式通常只提供REST词汇,但不支持链接数据。好的。型百万千克1百万千克1

    构建分层系统以提高可扩展性好的。型

    其余系统由层次层组成。每一层都包含使用下一层组件服务的组件。因此,您可以轻松地添加新的层和组件。好的。型

    例如,有一个包含客户机的客户机层,下面是一个包含单个服务的服务层。现在您可以在它们之间添加客户端缓存。之后,您可以添加另一个服务实例和负载平衡器,等等…客户端代码和服务代码不会更改。好的。型百万千克1百万千克1

    按需编码以扩展客户端功能好的。型

    此约束是可选的。例如,您可以向客户机发送特定媒体类型的解析器,等等…为了做到这一点,您可能需要在客户机中使用一个标准的插件加载程序系统,否则您的客户机将与插件加载程序解决方案耦合。好的。型百万千克1

    REST约束导致了一个高度可扩展的系统,其中客户机与服务实现分离。因此客户机可以重复使用,就像Web上的浏览器一样。客户机和服务共享相同的标准和词汇,因此尽管客户机不知道服务的实现细节,但他们可以相互理解。这使得创建自动化客户机成为可能,这些客户机可以找到并利用REST服务来实现他们的目标。从长远来看,这些客户机可以像人类一样,通过任务相互沟通和信任。如果我们向这些客户机添加学习模式,那么结果将是一个或多个使用机器网络的人工智能,而不是一个单一的服务器园区。因此,在最后,伯纳斯李的梦想:语义网和人工智能将成为现实。所以在2030年,我们最终被天网终止。直到那时…;-)好的。型好啊。


    RESTful(代表性状态转移)API编程是通过以下5种基本的软件体系结构风格原则,以任何编程语言编写Web应用程序:

  • 资源(数据、信息)。
  • 唯一全局标识符(所有资源都由URI唯一标识)。
  • 统一接口-使用简单的标准接口(HTTP)。
  • 表示-所有通信都是通过表示完成的(例如XML/JSON)
  • 无状态(每个请求都是完全隔离的,更容易缓存和负载平衡)。
  • 换句话说,您正在通过HTTP编写简单的点对点网络应用程序,它通过实现RESTful体系结构来使用诸如get、post、put或delete等动词,该体系结构提出了每个"资源"公开的接口的标准化。以一种简单有效的方式(高度成功、经验证和分布式的体系结构)使用Web的当前功能,这是无济于事的。它是SOAP、CORBA和RPC等更复杂机制的替代方案。

    RESTful编程符合Web体系结构设计,如果实现得当,它允许您充分利用可扩展的Web基础结构。


    REST是一种体系结构模式和编写分布式应用程序的风格。它不是狭义上的编程风格。

    说你使用休息的风格类似于说你建造了一个特殊的风格的房子:例如都铎式或维多利亚式。软件风格的休息和家庭风格的都铎或维多利亚都可以由构成它们的品质和约束来定义。例如,REST必须有客户机-服务器分离,其中消息是自描述的。都铎风格的房子有重叠的山墙和屋顶,它们与前面的山墙形成陡峭的倾斜。你可以阅读罗伊的论文来了解更多关于构成休息的约束和品质的知识。

    与家庭风格不同的是,在坚持和实际应用方面,休息是很困难的。这可能是故意的。将其实际实现留给设计人员。所以你可以自由地做你想做的事情,只要你满足论文中提出的限制条件,你就可以创建REST系统。

    奖金:

    整个网络基于REST(或REST基于Web)。因此,作为一个Web开发人员,您可能希望了解这一点,尽管不必编写好的Web应用程序。


    这是我休息的基本情况。我试图在一个RESTful体系结构中演示每个组件背后的思想,以便更直观地理解概念。希望这能帮助一些人揭开休息的神秘面纱!

    REST(代表性状态转移)是一种设计架构,它概述了如何设计和处理网络资源(即共享信息的节点)。一般来说,RESTful体系结构使得客户机(请求机)和服务器(响应机)可以请求读取、写入和更新数据,而客户机不必知道服务器是如何运行的,服务器也可以在不需要了解客户机的任何情况下将其传回。好的,很酷……但是我们如何在实践中做到这一点?

    • 最明显的要求是,需要某种通用语言,以便服务器能够告诉客户机它试图对请求做什么,并让服务器作出响应。

    • 但是,要找到任何给定的资源,然后告诉客户该资源在哪里,需要有一种通用的指向资源的方法。这就是通用资源标识符(uri)出现的地方;它们基本上是查找资源的唯一地址。

    但其余的建筑并没有就此结束!虽然上面的内容满足了我们所需要的基本需求,但是我们还希望拥有一个支持高流量的体系结构,因为任何给定的服务器通常处理来自多个客户机的响应。因此,我们不希望让服务器记住有关以前请求的信息,从而压倒服务器。

    • 因此,我们对客户机和服务器之间的每个请求-响应对都进行了限制,这意味着服务器不必记住任何有关以前的请求(客户机-服务器交互的以前状态)的信息来响应新的请求。这意味着我们希望我们的交互是无状态的。

    • 为了进一步减轻服务器上重做最近为给定客户机所做的计算的压力,REST还允许缓存。基本上,缓存意味着获取提供给客户机的初始响应的快照。如果客户机再次发出相同的请求,服务器可以向客户机提供快照,而不是重做创建初始响应所需的所有计算。但是,由于它是一个快照,如果快照没有过期——服务器预先设置了一个过期时间——并且响应在初始缓存(即请求将给出一个与缓存响应不同的响应)之后进行了更新,则在缓存过期(或缓存被清除)和响应之前,客户端将看不到更新。重新从头开始渲染。

    • 关于RESTful架构,您在这里经常遇到的最后一件事是它们是分层的。实际上,在讨论客户机和服务器之间的交互时,我们已经隐式地讨论了这个需求。基本上,这意味着系统中的每一层只与相邻的层交互。因此,在我们的讨论中,客户机层与服务器层交互(反之亦然),但可能还有其他服务器层帮助主服务器处理客户机不直接通信的请求。相反,服务器根据需要传递请求。

    现在,如果所有这些听起来都很熟悉,那就太好了。超文本传输协议(HTTP)定义了通过万维网的通信协议,它是RESTful体系结构抽象概念的实现(如果您是像我这样的OOP狂热者,则是REST类的实例)。在REST的这个实现中,客户机和服务器通过GET、POST、PUT、DELETE等进行交互,这是通用语言的一部分,资源可以指向使用URL的地方。


    如果我不得不将原来的论文的休息时间缩短为3个简短的句子,我认为以下内容抓住了它的本质:

  • 资源是通过URL请求的。
  • 协议仅限于使用URL进行通信的内容。
  • 元数据作为名称-值对(post-data和query-string参数)传递。
  • 之后,很容易陷入关于适应性、编码约定和最佳实践的争论中。

    有趣的是,本文中没有提到http-post、get、delete或put操作。这一定是后来有人对"统一接口"的"最佳实践"的解释。

    当涉及到Web服务时,我们似乎需要某种方法来区分基于WSDL和SOAP的体系结构,这会给接口增加相当大的开销,并且可能会增加很多不必要的复杂性。它们还需要额外的框架和开发人员工具来实现。我不确定REST是否是区分常识接口和过度设计的接口(如WSDL和SOAP)的最佳术语。但我们需要一些东西。


    我认为RESTful的要点是将状态分离为更高的层,同时将Internet(协议)用作无状态传输层。大多数其他方法都是混淆的。

    它是处理互联网时代编程的根本变化的最佳实践方法。关于基本变化,Erik Meijer在以下网站上进行了讨论:http://www.infoq.com/interfaces/erik Meijer programming language design effects purity_view_93197。他将其总结为五种效果,并通过将解决方案设计成编程语言来提出解决方案。解决方案,也可以在平台或系统级别实现,无论语言如何。RESTful可以看作是当前实践中非常成功的解决方案之一。

    使用RESTful样式,您可以通过不可靠的Internet获取和操作应用程序的状态。如果当前操作无法获得正确的当前状态,则需要零验证主体来帮助应用程序继续。如果它不能操纵状态,它通常使用多个确认阶段来保持事物的正确性。从这个意义上讲,REST本身并不是一个完整的解决方案,它需要Web应用程序堆栈的其他部分中的函数来支持它的工作。

    鉴于这种观点,REST样式实际上并不与Internet或Web应用程序相关联。它是许多编程情况的基本解决方案。它也不简单,它只是让界面变得非常简单,并且能够很好地处理其他技术。

    只是我的2C。

    编辑:更重要的两个方面:

    • 无国籍是一种误导。它是关于RESTfulAPI的,而不是应用程序或系统。系统需要有状态。RESTful设计是基于无状态API设计一个有状态的系统。一些来自另一个QA的引用:

      • REST在资源表示上操作,每个表示都由一个URL标识。这些通常不是数据对象,而是复杂的对象抽象。
      • REST代表"代表性状态转移",这意味着它完全是关于系统中某些资源的状态的通信和修改。
    • 等幂:其余的一个经常被忽视的部分是大多数动词的等幂。这就导致了强大的系统和对语义精确解释的依赖性降低。


    这是令人惊讶的漫长的"讨论",但至少可以说是相当混乱。

    国际海事组织:

    1)没有一个大的关节和大量的啤酒,就没有一个安静的程序。)

    2)代表性状态转移(REST)是罗伊·菲尔丁(Roy Fielding)论文中规定的一种建筑风格。它有许多约束条件。如果您的服务/客户尊重这些,那么它就是休息的。就是这样。

    您可以总结(显著)以下限制:

    • 无状态通信
    • 遵守HTTP规范(如果使用HTTP)
    • 明确传达传输的内容格式
    • 使用超媒体作为应用程序状态引擎

    还有一篇很好的文章能很好地解释问题。

    很多答案都是复制/粘贴有效的信息,混合在一起,增加了一些混乱。这里人们谈论的是级别,关于RESTful URI(没有这样的事情!),应用http方法get,post,put…休息不只是为了这个,也不只是为了那个。

    例如,链接——拥有一个漂亮的API是很好的,但最终客户机/服务器并不真正关心你得到/发送的链接,重要的是内容。

    最后,只要内容格式已知,任何RESTful客户机都应该能够使用到任何RESTful服务。


    rest==http类比在强调它"必须"是hateoas驱动之前是不正确的。

    罗伊自己在这里清除了。

    除了初始的URI(书签)和一组适用于预期访问群体的标准化媒体类型(即任何可能使用该API的客户机都应该理解)之外,不应在事先知情的情况下输入REST API。从那时起,所有应用程序状态转换都必须由客户机选择服务器提供的选项驱动,这些选项存在于接收的表示中,或者由用户对这些表示的操作所隐含。转换可以由客户对媒体类型和资源通信机制的了解来确定(或限制),这两种机制都可以随时改进(例如,按需代码)。

    [这里的失败意味着带外信息正在驱动交互而不是超文本。]


    旧问题,新的回答方式。关于这个概念有很多误解。我总是努力记住:

  • 结构化URL和HTTP方法/动词不是RESTful编程。
  • JSON不是RESTful编程
  • RESTful编程不适用于API
  • 我将RESTful编程定义为

    An application is restful if it provides resources (being the combination of data + state transitions controls) in a media type the client understands

    要成为一个休息的程序员,您必须尝试构建允许参与者做事情的应用程序。不仅仅是公开数据库。

    只有当客户端和服务器同意资源的媒体类型表示形式时,状态转换控制才有意义。否则就无法知道什么是控件,什么不是控件,以及如何执行控件。也就是说,如果浏览器不知道HTML中的

    标记,那么在浏览器中就没有什么东西可以提交到转换状态。

    我不想自我推销,但我在我的演讲中对这些想法进行了深入的探讨,http://techblog.bodybuilding.com/2016/01/video-what-is-restful-200.html。

    我演讲的一个节选是关于经常提到的理查森成熟度模型,我不相信这些层次,你要么是休息的(3级),要么不是,但我想指出的是,在你休息的过程中,每一个层次都为你做了些什么。

    annotated richardson maturity model


    REST is an architectural style which is based on web-standards and the HTTP protocol (introduced in 2000).

    在基于REST的体系结构中,一切都是资源(用户、订单、注释)。通过基于HTTP标准方法(GET、PUT、PATCH、DELETE等)的公共接口访问资源。

    In a REST based architecture you have a REST server which provides
    access to the resources. A REST client can access and modify the REST
    resources.

    每个资源都应该支持HTTP公共操作。资源由全局ID(通常是URI)标识。

    REST允许资源具有不同的表示,例如文本、XML、JSON等。REST客户机可以通过HTTP协议(内容协商)请求特定的表示。

    HTTP方法:

    Put、Get、Post和Delete方法在基于REST的体系结构中是典型的应用。下表说明了这些操作。

    • get定义对资源的读取访问,而不产生副作用。资源从不通过GET请求更改,例如,请求没有副作用(等量)。
    • Put创建新资源。它也必须是等幂的。
    • 删除删除资源。操作是等幂的。它们可以重复,而不会导致不同的结果。
    • Post更新现有资源或创建新资源。


    REST定义了6个体系结构约束,使任何Web服务成为真正的RESTfulAPI。

  • 均匀界面
  • 客户端-服务器
  • 无国籍的
  • 可缓存的
  • 分层系统
  • 按需代码(可选)
  • https://restfulapi.net/rest-architecture-constraints/


    本质上没有"RESTful编程"这样的概念。它最好被称为RESTful范式,或者甚至更好的RESTful体系结构。它不是一种编程语言。这是一个范例。

    维基百科:

    In computing, representational state transfer (REST) is an
    architectural style used for web development.


    其余代表国家转移。

    它依赖于一个无状态的、客户机-服务器的、可缓存的通信协议——实际上在所有情况下,都使用HTTP协议。

    REST通常用于移动应用程序、社交网站、mashup工具和自动化业务流程。REST样式强调客户端和服务之间的交互是通过有限的操作(动词)来增强的。灵活性是通过分配资源(名词)它们自己独特的通用资源指示器(uri)来实现的。

    休息介绍


    谈话不仅仅是交换信息。一个协议实际上是设计成不需要说话。每一方都知道他们的特定工作是什么,因为协议中有规定。协议允许纯粹的信息交换,代价是对可能的操作进行任何更改。另一方面,谈话允许一方询问另一方可以采取哪些进一步的行动。他们甚至可以问同一个问题两次,得到两个不同的答案,因为另一方的状态可能在过渡时期发生了变化。谈话是一种宁静的建筑。菲尔丁的论文详细说明了一种体系结构,如果你想让机器彼此交谈而不是简单地交流,你必须遵循这种体系结构。


    休息的要点是,如果我们同意对基本操作(HTTP谓词)使用通用语言,则可以配置基础结构来理解它们并对它们进行适当的优化,例如,通过使用缓存头来实现各级缓存。

    通过一个正确实现的restful get操作,信息是否来自服务器的db、服务器的memcache、cdn、代理的缓存、浏览器的缓存或浏览器的本地存储都不重要。可以使用最新的、最容易获得的紧固源。

    如果说rest只是一个语法上的变化,从使用带有动作参数的get请求到使用可用的HTTP动词,这使得它看起来没有任何好处,只是一种纯粹的修饰。重点是使用一种可以被链的每个部分理解和优化的语言。如果GET操作有副作用,则必须跳过所有HTTP缓存,否则最终会得到不一致的结果。


    什么是API测试?

    API测试利用编程向API发送调用并获得收益。IT测试将被测段视为黑盒。API测试的目的是确认在应用程序中协调之前正确执行和错误处理部件。

    REST API

    休息:代表性状态转移。

    • 它是测试人员执行请求和接收响应的一种功能安排。在REST中,API通过HTTP协议进行交互。
    • REST还允许计算机之间通过网络进行通信。
    • 对于发送和接收消息,它涉及到使用HTTP方法,与Web服务不同,它不需要严格的消息定义。
    • REST消息通常接受XML或JavaScript对象表示法(JSON)的形式。

    4常用的API方法:

  • 获取:–它提供对资源的只读访问。
  • 发布:–用于创建或更新新资源。
  • 放置:–用于更新或替换现有资源或创建新资源。
  • 删除:–用于删除资源。
  • 手动测试API的步骤:

    要手动使用API,我们可以使用基于浏览器的RESTAPI插件。

  • 安装postman(chrome)/rest(firefox)插件
  • 输入API URL
  • 选择休息方法
  • 选择内容标题
  • 输入请求json(post)
  • 点击发送
  • 它将返回输出响应
  • 自动化REST API的步骤


    这在任何地方都很少被提及,但理查森的成熟度模型是实际判断一个人的API有多RESTful的最佳方法之一。关于它的更多信息:

    理查森成熟度模型


    我想说,理解REST的一个重要组成部分在于端点或映射,比如/customers/{id}/balance

    您可以想象这样一个端点是从网站(前端)到数据库/服务器(后端)的连接管道。使用它们,前端可以执行后端操作,这些操作是在应用程序中任何REST映射的相应方法中定义的。


    这些给出链接资源示例的答案很好,但只有一半。

    所以,假设你正在设计一个网站。你写一个故事,

    我想通过邮政编码搜索一个地址,这样我可以选择一个送货地址

    然后,您将构建一个站点来引导用户进行这一旅程,并尝试在工作流中将页面链接在一起。

    一个网站设计,把他们带到一个地址查找,然后让他们把地址复制到剪贴板,然后返回到送货地址表单将不是很有用。

    RESTAPI使用我们在Web上认为理所当然的模式进行机器-机器交互。

    对邮政编码功能的搜索不应该是base/addresses/{postcode},即使每个地址链接到一个完整地址和一些编辑链接,集合也会返回,因为这是一个死胡同;API消费者需要猜测如何使用该地址。

    相反,该功能的动机应该内置于其使用的流程中,以便行程在开始时结束:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    1 GET /orders/123/shipping

      200 OK { Current shipping details + link to parent + link to address picker }

    2  -> GET /orders/123/shipping/addresspicker

          200 OK { Link and form for searching for a postcode }

    3   -> GET /orders/123/shipping/addresspicker?postcode=tn11tl

           200 OK { List of addresses each with link to pick it }

    4    -> POST /orders/123/shipping/addresspicker?postcode=tn11tl&pickNo=3

            200 OK { Current shipping details + link to parent + link to address picker }

    这是一个用户的旅程,最后你可以看到流程对订单的影响。

    HTTP请求/响应不是REST的严格组成部分,但我认为没有人见过非HTTP REST应用程序。

    现在,这些URL可以是任何一组字符,它们只是标识符,我使它们很漂亮是因为它们对人有意义。一台机器将使用rel来计算它们的功能,而不依赖于可读的href


    REST是一个分布式系统(如WWW)的软件架构风格,可以想象它是一个精心设计的Web应用程序规则:一组Internet网页(一个虚拟状态机),其中超链接通过单击链接(状态转换),结果是下一个网页(即应用程序的下一个状态)。

    REST描述了网络系统由三部分组成:

    百万千克1数据元素(资源、资源标识符、表示)百万千克1百万千克1连接器(客户端、服务器、缓存、冲突解决程序、隧道)百万千克1百万千克1组件(源服务器、网关、代理、用户代理)百万千克1

    休息应严格符合下列条件:

    百万千克1应用程序功能的状态被拆分为资源百万千克1百万千克1用作超链接定位语法的每个资源(即,在www-uri中)百万千克1百万千克1所有资源在客户端与资源转换状态之间共享统一的接口,包括:百万千克1一组有限的定义良好的操作(即在HTTP GET/POST/PUT/DELETE中)百万千克1百万千克1一组有限的内容格式内容类型,其中可能包括可执行代码(例如,在www-javascript中)百万千克1百万千克1