http - 究竟什么是RESTful编程?

  显示原文与译文双语对照的内容
0 0

究竟什么是RESTful编程?

时间: 原作者:

0 0

REST是底层网络的架构原则。 网络的神奇之处是客户( 浏览器) 客户端和服务器可以在复杂的方式相互作用没有任何事先了解它主机服务器和资源。 键约束是服务器和客户端都必须同意媒体使用,这对于网络是 html。

其他的api遵循的原则不要求客户端了解结构的api。 相反,服务器需要提供客户端与服务交互所需的任何信息。 一个html表单是一个这样的例子: 服务器指定资源的位置和所需的字段。 浏览器事先不知道提交信息的位置,而且不知道要提交什么信息。 两种形式的信息都由服务器提供。 ( 这里原理称为 )

,这将如何应用到 HTTP,如何在实践中实现? HTTP面向动词和资源。 主流用法的两个动词,我认为大家都会认识到。 但是,HTTP标准定义了一些其他的,比如放置和删除。 然后根据服务器提供的说明将这些谓词应用于资源。

例如假设我们有一个由网络服务管理的用户数据库。 我们的服务使用基于JSON的定制超媒体,我们为它分配了 mime 应用程序/json+userdb ( 也许还有一种应用程序/xml+userdb和应用程序/whatever+userdb——许多媒体类型可能会支持) 。 客户端和服务器都被编程来理解这种格式,但是他们并不了解彼此。 Roy部署指出:

REST API 应该花费几乎所有的描述性努力来定义用于表示资源和驱动应用程序状态的媒体类型,或者为现有标准媒体类型定义扩展关系名称和/或者 hypertext-enabled mark-up 。

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

请求


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"
 }
 ]
}

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

请求


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"
 }
 ]
}

我们可以从这个响应中得到很多信息。 例如我们现在知道可以通过向/用户投递来创建一个新用户:

请求


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谓词( 获取,放置,投递,删除 等等 ) 来操纵这些资源,并且我们在客户端上假定的唯一知识是我们的媒体定义。

进一步阅读:

( 这个答案已经受到了大量批评,因为缺少点。 在大多数情况下,这是一个公平的评论。 我最初描述的更多的是,在几年前,REST是如何实现的,而不是真正的意义。 我已经修改了答案,以更好地表示真实意义。

原作者:
0 0

请原谅( 而且我倾向于少数),RESTful编程是关于:

  • 由持久标识符标识的资源: uri是目前无处不在的标识符选择
  • 使用一组常用谓词操作的资源: HTTP方法是常见的情况- venerable CreateRetrieveUpdateDelete 变成 POSTGETPUTDelete
  • 为资源检索的实际表示依赖于请求而不是标识符: 使用HTTP接受标头控制你是否想要使用 XML,HTTP,甚至是一个代表资源的Java对象
  • 在对象中维护状态并表示表示中的状态
  • 表示资源表示形式中资源之间的关系: 对象之间的链接直接嵌入到表示中
  • 资源表示描述了如何使用表示,以及在何种情况下应该将它的丢弃/refetched: HTTP Cache-Control标头的用法

最后一个可能是关于REST的结果和整体效果的最重要的。 总的来说,大多数rest式讨论似乎都在HTTP中居中,以及它从浏览器中的用法以及哪些内容。 我理解 R 。Fielding创建了一个术语,当他描述了架构和决定导致 HTTP 。 他的论文更多的是关于资源的架构和 cache-ability,而不是关于HTTP的。

如果你真正感兴趣的restful架构是什么,为什么它的作品,读他论文几次和阅读不仅整个 5章! 下一步查看为什么DNS是 。 了解关于DNS的分层组织以及引用的工作方式。 然后阅读并考虑DNS缓存是如何工作的。 最后,阅读HTTP规范( RFC2616RFC3040 ) 并考虑缓存的工作原理和原因。 最后,它只是点击。 当我看到了DNS和HTTP之间的相似性时,final的启示是。 在这之后,理解为什么SOA和消息传递接口是可以扩展的。

我认为理解RESTful和的体系结构重要性和性能含义的最重要的技巧是避免在技术和实现细节上挂起。 关注谁拥有资源,谁负责创建/维护他们,然后考虑表示,协议和技术。

原作者:
0 0

这就是它的样子:


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

服务器响应:


200 OK
Location:/user/123

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

 
GET/user/123

 

服务器响应:


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

要更新:


PUT/user/123
fname=Johnny

原作者:
0 0

一本关于REST的好书是 REST的实践。

必须读取代表状态传输( 其余部分)REST api必须是 hypertext-driven

请参阅 Martin Fowlers文章 Richardson成熟度模型 ( RMM ) 关于rest服务的解释。

Richardson Maturity Model

为了保持 RESTful,服务需要实现超媒体作为应用程序状态引擎。 (hateoas),它需要达到水平 3 rmm, 读这篇文章详情或从 qcon 幻灯片交谈。

HATEOAS约束是一个超媒体的缩写,作为应用程序状态的引擎。 这个原则是REST和大多数其他客户机服务器系统之间的关键区别。

RESTful应用程序的客户端只需要知道一个固定的URL来访问它。 所有未来的操作都应该从包含在这个URL中的资源的表示中动态的发现超媒体链接。 标准媒体类型也可以被任何可能使用 RESTful API的客户端所理解。 ( 维基百科,免费百科全书)

REST框架测试Web框架是一个类似于Web框架的成熟度测试。

接近 REST: 学习HATEOAS的是一个不错的链接集合。

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

REST和版本控制讨论可扩展性,版本控制,Evolvability,等等 通过修改

原作者:
0 0

休息

REST代表具象状态转移。 ( 有时是"其余部分"。) 它依赖于一个无状态 client-server,可以缓存的通信协议 --,在几乎所有情况下都使用HTTP协议。

REST是一个用于设计联网应用程序的架构风格。 它的思想是,不使用复杂的机制如 CORBA,RPC或者SOAP来连接机器,简单的HTTP用来在机器之间进行调用。

在很多方面,基于HTTP的万维网本身可以看作是一个REST-based架构。 RESTful应用程序使用HTTP请求发布数据( 创建和/或者更新),读取数据( e.g,进行查询) 和删除数据。 因此,REST为所有四个CRUD操作使用 HTTP 。

REST是一个轻量级的替代机制,比如 RPC ( 远程过程调用) 和 Web服务 ( SOAP,WSDL,等。) 。 稍后,我们将看到更简单的REST 。

尽管简单,REST是 fully-featured ;在 Web服务 中你不能做任何不能用RESTful架构完成的事情。 REST不是"标准"。 永远不会有 W3C recommendataion的REST,例如。 虽然有其他编程框架,工作与休息是如此简单,你可以经常与标准库"自行滚动"功能语言如perl、java、或 C# 。

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

http://rest.elkstein.org/

原作者:
0 0

这是编程,系统的架构符合rest风格罗伊菲尔丁在他的论文。 由于这是描述站点( 或多或少)的架构风格,许多人对它感兴趣。

奖金的回答:没有。除非你是研究软件架构作为一个学术或设计 Web服务, 真的没有听过这个词的理由。

原作者:
0 0

REST正在使用各种HTTP方法( 主要是 GET/PUT/DELETE) 来操纵数据) 。

除了使用特定的URL删除方法( 比如说,/user/123/delete ) 之外,你将向 /user/[id] URL发送一个删除请求,以便编辑用户,以编辑用户的信息,以便向 /user/[id] 发送获取请求

例如一组url可能看起来像下面的部分。


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"动词"并具有。


GET/user/2
DELETE/user/2
PUT/user

原作者:
0 0

如果我没有直接回答问题,我深表歉意,但更容易理解的是更详细的例子。 由于所有的抽象和术语,部署不容易理解。

这里有一个相当好的例子:

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

更妙的是,这里有一个简洁的解释,简单示例( powerpoint更加全面,但是你可以在html版本中获得大部分):

http://www.xfront.com/REST.ppt 或者 http://www.xfront.com/REST.html

在阅读完这些例子之后,我可以看到为什么Ken说REST是 hypertext-driven 。 我并不确定他有权利,因为/user/123 是一个指向资源的uri,我不清楚,这是 unRESTful out-of-band仅仅因为客户知道。"

xfront文档解释了REST和SOAP之间的区别,这也很有帮助。 当启动时,"是 RPC 。 它尖叫 RPC 。",显然RPC不是RESTful的,所以很有用的原因是。 ( SOAP是一种RPC类型。)

0 0

我看到一堆答案说把一切用户 123"/user/123" 是restful资源。

创建术语的Roy Fielding说,REST api必须是 hypertext-driven 。 特别是"REST API 不能定义固定的资源名称或者层次结构"。

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

原作者:
0 0

rest 是什么?

REST是官方语言,REST是使用当前"站点"基础知识构建在某些原则之上的架构风格。 有 5个基本的站点基础,用来创建REST服务。

  • 原则 1: 所有内容都是REST架构风格中的资源,数据和功能被认为是资源,使用统一资源标识符( uri ) 访问,通常是站点上的链接。
  • 原则 2: 每个资源都由唯一标识符( URI ) 标识
  • 原则 3: 使用简单统一的接口
  • 原则 4: 通信通过表示完成
  • 原则 5: 无状态
原作者:
...