RESTful编程到底是什么?
当前回答
我会说,RESTful编程是关于创建遵循REST体系结构风格的系统(API)。
我发现M.Elkstein博士的这篇关于REST的精彩、简短且易于理解的教程,并引用了最能回答您问题的重要部分:
学习REST:教程
REST是一种用于设计网络应用程序的架构风格。其思想是,使用RPC或SOAP连接机器,使用简单的HTTP机器之间的呼叫。在许多方面,基于HTTP的万维网本身可以被视为基于REST的架构。RESTful应用程序使用HTTP请求来发布数据(创建和/或更新)、读取数据(例如进行查询)和删除数据。因此,REST对所有四个CRUD(创建/读取/更新/删除)操作使用HTTP。
我认为你不应该因为没有听到堆栈溢出之外的REST而感到愚蠢。。。,我也会遇到同样的情况!;另一个SO问题“为什么REST现在变得越来越大”的答案可能会缓解一些情绪。
其他回答
答案很简单,罗伊·菲尔丁写了一篇论文。]1在那篇论文中,他定义了REST原则。如果应用程序满足所有这些原则,那么这就是REST应用程序。
之所以创建RESTful一词,是因为ppl通过将其非REST应用程序称为REST而耗尽了REST一词。此后,RESTful一术语也耗尽了。现在我们讨论的是Web API和超媒体API,因为大多数所谓的REST应用程序都没有实现统一接口约束的HATEOAS部分。
REST约束如下:
客户端-服务器体系结构因此,它不适用于例如PUB/SUB套接字,而是基于REQ/REP。无状态通信因此,服务器不维护客户端的状态。这意味着您不能使用服务器侧会话存储,并且必须对每个请求进行身份验证。您的客户端可能通过加密连接发送基本身份验证标头。(对于大型应用程序,很难维护许多会话。)如果可以,请使用缓存因此,您不必一次又一次地满足相同的请求。作为客户机和服务器之间通用契约的统一接口客户端和服务器之间的契约不由服务器维护。换句话说,客户端必须与服务的实现分离。您可以通过使用标准解决方案来达到这种状态,例如用于标识资源的IRI(URI)标准、用于交换消息的HTTP标准、用于描述消息体序列化格式的标准MIME类型、用于描述邮件体不同部分语义的元数据(可能是RDF vocabs、微格式等)。为了将IRI结构与客户端分离,必须以超媒体格式(HTML、JSON-LD、HAL等)向客户端发送超链接。因此,客户端可以使用分配给超链接的元数据(可能是链接关系、RDF vocabs),通过适当的状态转换来导航应用程序的状态机,以实现其当前目标。例如,当客户想要向网络商店发送订单时,必须检查网络商店发送的响应中的超链接。通过检查链接,可以找到http://schema.org/OrderAction.客户机知道schema.org vocab,因此它知道通过激活这个超链接,它将发送订单。因此它激活超链接并发送POSThttps://example.com/api/v1/order以恰当的方式传递信息。之后,服务处理消息并以具有正确HTTP状态标头的结果进行响应,例如201-由成功创建。为了用详细的元数据注释消息,标准解决方案使用RDF格式,例如JSON-LD和REST vocab,例如Hydra和领域特定vocab(如schema.org或任何其他链接数据vocab),如果需要,还可以使用定制的应用程序特定vocab。现在这并不容易,这就是为什么大多数应用程序使用HAL和其他简单格式,这些格式通常只提供REST vocab,但不提供链接数据支持。构建分层系统以提高可扩展性REST系统由层次结构层组成。每一层包含使用下一层组件的服务的组件。因此,您可以轻松添加新的图层和组件。例如,有一个包含客户端的客户端层,在该层之下有一个服务层,该服务层包含单个服务。现在,您可以在它们之间添加客户端缓存。之后,您可以添加另一个服务实例和负载平衡器等…客户端代码和服务代码不会更改。扩展客户端功能的按需代码此约束是可选的。例如,您可以向客户端发送特定媒体类型的解析器,等等…为了做到这一点,您可能需要客户端中的标准插件加载器系统,或者您的客户端将耦合到插件加载器解决方案。
REST约束导致了一个高度可扩展的系统,其中客户端与服务的实现分离。因此,客户端可以是可重用的,就像web上的浏览器一样。客户机和服务共享相同的标准和语音,因此尽管客户机不知道服务的实现细节,但它们可以相互理解。这使得创建能够找到并利用REST服务实现其目标的自动化客户端成为可能。从长远来看,这些客户端可以像人类一样相互通信,在任务上相互信任。如果我们向这些客户端添加学习模式,那么结果将是一个或多个使用机器网络的人工智能,而不是一个服务器园区。因此,伯纳斯-李的梦想终于实现了:语义网络和人工智能将成为现实。因此,到2030年,我们最终被天网终止。在此之前…;-)
REST是web的基础架构原则。web的惊人之处在于,客户端(浏览器)和服务器可以以复杂的方式交互,而客户端事先不知道服务器及其托管的资源。关键的限制是服务器和客户端都必须对所使用的媒体达成一致,在web的情况下,媒体是HTML。
遵循REST原则的API不要求客户端了解API的结构。相反,服务器需要提供客户端与服务交互所需的任何信息。HTML表单就是这样的一个例子:服务器指定资源的位置和所需的字段。浏览器事先不知道在哪里提交信息,也不知道要提交什么信息。这两种形式的信息完全由服务器提供。(这一原则被称为HATEOAS:作为应用程序状态引擎的超媒体。)
那么,这如何适用于HTTP,如何在实践中实现呢?HTTP以动词和资源为导向。主流用法中的两个动词是GET和POST,我想每个人都会认识到。然而,HTTP标准定义了其他几个,如PUT和DELETE。然后根据服务器提供的指令将这些动词应用于资源。
例如,假设我们有一个由web服务管理的用户数据库。我们的服务使用一个基于JSON的自定义超媒体,为此我们分配了mimetype application/JSON+userdb(也可能有application/xml+userdb和application/whatever+userdb-可能支持许多媒体类型)。客户机和服务器都经过编程,可以理解这种格式,但他们对彼此一无所知。正如罗伊·菲尔丁指出的:
REST API应该在定义用于表示资源和驱动的媒体类型应用程序状态,或定义扩展关系名称和/或现有标准媒体类型的超文本标记。
对基本资源/的请求可能会返回如下内容:
要求
GET /
Accept: application/json+userdb
回答
200 OK
Content-Type: application/json+userdb
{
"version": "1.0",
"links": [
{
"href": "/user",
"rel": "list",
"method": "GET"
},
{
"href": "/user",
"rel": "create",
"method": "POST"
}
]
}
我们从媒体的描述中知道,我们可以从“链接”部分找到有关相关资源的信息。这称为超媒体控件。在这种情况下,我们可以从这样一个部分看出,通过对/user发出另一个请求,我们可以找到一个用户列表:
要求
GET /user
Accept: application/json+userdb
回答
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"
}
]
}
从这一反应中我们可以看出很多。例如,我们现在知道可以通过向/user发帖来创建新用户:
要求
POST /user
Accept: application/json+userdb
Content-Type: application/json+userdb
{
"name": "Karl",
"country": "Austria"
}
回答
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"
}
}
我们还知道,我们可以更改现有数据:
要求
PUT /user/1
Accept: application/json+userdb
Content-Type: application/json+userdb
{
"name": "Emil",
"country": "Bhutan"
}
回答
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动词(GET、PUT、POST、DELETE等)来操纵这些资源,并且我们假设客户端的唯一知识是我们的媒体定义。
进一步阅读:
这一页上有很多更好的答案。我如何向妻子解释REST。我如何向妻子解释REST。马丁·福勒的思想PayPal的API具有超媒体控制
(这个答案因为没有抓住重点而受到了相当多的批评。在大多数情况下,这是一个公平的批评。我最初描述的内容更符合几年前我第一次写这篇文章时REST通常是如何实现的,而不是它的真正含义。我修改了答案,以更好地代表真正的含义。)
这是一种编程,您的系统架构符合Roy Fielding在论文中提出的REST风格。由于这是描述网络的架构风格(或多或少),所以很多人都对它感兴趣。
另外一个答案是:没有。除非你是作为学术研究软件架构或设计web服务,否则真的没有理由听过这个词。
交谈不仅仅是交换信息。协议实际上是这样设计的,因此不必进行对话。每一方都知道他们的具体工作是什么,因为它在协议中有所规定。协议允许纯粹的信息交换,而不需要对可能的操作进行任何更改。另一方面,谈话允许一方询问另一方可以采取什么进一步行动。他们甚至可以问同一个问题两次,并得到两个不同的答案,因为另一方的状态可能在这期间发生了变化。对话是RESTful架构。菲尔丁的论文规定了如果一个人想让机器彼此交谈而不是简单地通信,那么他必须遵循的体系结构。
RESTAPI是一种遵循REST体系结构约束的API实现。它充当一个接口。客户端和服务器之间的通信通过HTTP进行。RESTAPI利用HTTP方法建立客户端和服务器之间的通信。REST还使服务器能够缓存响应,从而提高应用程序的性能。客户端和服务器之间的通信是一个无状态的过程。我的意思是,客户端和服务器之间的每一次通信都像一次新的通信。
没有从以前的通信中携带的信息或记忆。因此,每次客户端与后端交互时,它都必须向其发送身份验证信息。这使后端能够确定客户端是否有权访问数据。
通过REST API的实现,客户端可以获得要与之通信的后端端点。这完全分离了后端和客户端代码。
推荐文章
- 有没有REST api的命名规范指南?
- 由Jon Skeet撰写的《Singleton》澄清
- 什么是HTTP中的“406-不可接受的响应”?
- 最好的轻量级web服务器(只有静态内容)的Windows
- HTTP POST在Java中使用JSON
- 哪些HTTP方法与哪些CRUD方法相匹配?
- 使用HTML形式的PUT方法
- 如何转义哈希字符在URL
- RESTful服务中部分更新的最佳实践
- JAX-RS / Jersey如何自定义错误处理?
- 有没有办法在python中做HTTP PUT
- 我能在服务器端应用程序(PHP、Ruby、Python等)上读取URL的哈希部分吗?
- 如何POST表单数据与Spring RestTemplate?
- 什么是http头“X-XSS-Protection”?
- 在nodejs http中body在哪里。得到回应?