使用REST而不是非REST HTTP有什么好处?

Dim*_* C. 156 rest

显然,REST只是一组关于如何使用HTTP的约定.我想知道这些惯例提供了哪些优势.有人知道吗?

Tim*_*mmm 155

我认为你不会得到一个好的答案,部分原因是没有人真正同意REST 什么.在维基百科页面是关于解释流行语和轻重.讨论页面值得一试,只是为了看看有多少人不同意这一点.据我所知,REST意味着:

而不是随机命名的setter和getter URL和使用的GET所有的getter和POST所有制定者,我们希望拥有的URL标识资源,然后使用HTTP动作GET,POST,PUTDELETE做的东西给他们.而不是

GET /get_article?id=1
POST /delete_article   id=1
Run Code Online (Sandbox Code Playgroud)

你会的

GET /articles/1/
DELETE /articles/1/
Run Code Online (Sandbox Code Playgroud)

然后POSTPUT对应于"创造"和"更新"操作(但没有人同意哪一种方式圆).

我觉得缓存参数是错误的,因为查询字符串一般缓存,再说你不是真的需要使用它们.例如,django很容易做到这一点,我不会说它是REST:

GET /get_article/1/
POST /delete_article/     id=1
Run Code Online (Sandbox Code Playgroud)

或者甚至只在URL中包含动词:

GET /read/article/1/
POST /delete/article/1/
POST /update/article/1/
POST /create/article/
Run Code Online (Sandbox Code Playgroud)

在这种情况下GET意味着没有副作用的POST东西,并且意味着改变服务器上的数据.我想,这也许是有点更清晰,更容易,尤其是当你能避免整个PUT航班吗POST事情.另外,如果您愿意,可以添加更多动词,因此您不会被人为地绑定到HTTP提供的内容.例如:

POST /hide/article/1/
POST /show/article/1/
Run Code Online (Sandbox Code Playgroud)

(或者无论如何,在它们发生之前很难想到它们!)

总而言之,我只能看到两个优势:

  1. 您的Web API可能更清晰,更易于理解/发现.
  2. 在与网站同步数据时,使用REST可能更容易,因为您可以说synchronize("/articles/1/")或其他什么.这很大程度上取决于您的代码.

不过我觉得有一些很大的缺点:

  1. 并非所有操作都可以轻松映射到CRUD(创建,读取/检索,更新,删除).您甚至可能没有处理对象类型资源.
  2. 对于可疑的好处,这是额外的努力.
  3. 分不清哪些方式轮PUTPOST是.在英语中,它们意味着类似的东西("我打算在墙上发布/发布通知.").

总而言之,我会说:除非您真的想要付出额外的努力,或者如果您的服务非常适合CRUD操作,请为您的第二版API保存REST.


我刚刚遇到了REST的另一个问题:在一个请求中执行多个操作并指定要获取的复合对象的哪个部分并不容易.这在移动设备上尤为重要,因为往返时间可能很长并且连接不可靠.例如,假设您在Facebook时间线上收到帖子."纯粹的"REST方式就像是

GET /timeline_posts     // Returns a list of post IDs.
GET /timeline_posts/1/  // Returns a list of message IDs in the post.
GET /timeline_posts/2/
GET /timeline_posts/3/
GET /message/10/
GET /message/11/
....
Run Code Online (Sandbox Code Playgroud)

这有点荒谬.Facebook的API非常棒IMO,所以让我们看看他们做了什么:

默认情况下,进行查询时会返回大多数对象属性.您可以使用"fields"查询参数选择要返回的字段(或连接).例如,此URL仅返回Ben的id,name和picture:https://graph.facebook.com/bgolub?fields = id,name,picture

我不知道你怎么用REST做这样的事情,如果你做了它是否仍然算作REST.我肯定会忽略那些试图告诉你你不应该这样做的人(特别是如果原因是"因为它不是REST")!

  • 对我来说,Facebook API示例看起来像REST(实际上远远超过了您在URL中使用动词的示例).没有理由认为查询参数不能是RESTful,使用可以在层次结构中排列数据的路径只是一种好习惯. (7认同)
  • 只要您没有引用其中的资源,查询字符串就完全是RESTful.我倾向于认为它们更像是可以调整端点行为的过滤器. (5认同)
  • POST和PUT是根据HTTP RFC使用的.在这种情况下,PUT意味着在特定位置创建/更新某些东西 - 这取决于URI中是否已存在某些东西(并且它也是幂等的),而POST意味着您要求Web服务确定将您放置的位置发送它 - 然后它返回URI(所以它只是创建).不能真的抱怨英语,而不是在提到计算机上的任何东西时完全不使用DELETE.我想知道如何处理编辑中出现的问题:P (4认同)
  • -1,REST非常具体 - 正如Roy Fielding在发明它时所描述的那样.请参阅[此答案](http://stackoverflow.com/questions/5320003/why-we-should-use-rest).特别是:*"客户端只需知道初始URI,然后从服务器提供的选择中选择导航或执行操作."*.基本上,如果API的任何部分记录端点,例如说"给定用户ID,您可以在`/ user/{id}`获取用户信息",那么它就不会很安静.考虑一下:您的浏览器是否必须预先编程,知道如何获取stackoverflow问题页面的HTML? (3认同)

Emi*_*nov 44

简而言之,REST意味着使用HTTP的方式.

看看Roy Fielding关于REST的论文.我认为每个正在进行Web开发的人都应该阅读它.

作为一个说明,Roy Fielding也是HTTP协议背后的关键驱动因素之一.

列举一些优点:

  • 简单.
  • 您可以充分利用HTTP缓存和代理服务器来帮助您处理高负载.
  • 它可以帮助您将非常复杂的应用程序组织成简单的资源.
  • 它使新客户可以轻松使用您的应用程序,即使您没有专门为他们设计(可能是因为他们在您创建应用程序时不在身边).

  • 符合REST约束绝对不简单.将复杂的业务操作压缩成四个标准动词实际上有时候很难.但是,如果做得好,最终结果可以很容易理解,但除此之外什么都没有. (22认同)
  • "简单":为什么REST比HTTP简单? (11认同)
  • @Dimitri:"简单",因为它为您提供了一个简单的框架.REST*是*HTTP!它比SOAP更简单(甚至名称简单)."帮助你组织" - 这个概念不是很难理解,一旦正确实施,它就能很好地完成.然而,REST可以作为设计应用程序的一种方式,而不是实现细节.正如达雷尔指出实施它可能并不容易,但结果是有益的."它使新客户端可以轻松使用您的应用程序" - 再次:REST*是*HTTP. (6认同)
  • "帮助你组织":那么仅仅使用GET和POST时这个组织就更难了? (5认同)

Pet*_*ler 29

简单地说:没有.

请随意关注,但我仍然认为与非REST HTTP相比没有任何实际好处.所有当前答案均无效.目前投票最多的回答是:

  • 简单.
  • 您可以充分利用HTTP缓存和代理服务器来帮助您处理高负载.
  • 它可以帮助您将非常复杂的应用程序组织成简单的资源.
  • 它使新客户可以轻松使用您的应用程序,即使您没有专门为他们设计(可能是因为他们在您创建应用程序时不在身边).

1.简单

使用REST,您需要为服务器端和客户端脚本提供额外的通信层=>它实际上比使用非REST HTTP更复杂.

2.缓存

缓存可以由服务器发送的HTTP标头控制.REST不会添加非REST中缺少的任何功能.

3.组织

REST不能帮助您组织事情.它强制您使用您正在使用的服务器端库支持的API.使用非REST方法时,可以以相同的方式(或更好)组织应用程序.例如,请参阅模型 - 视图 - 控制器MVC路由.

4.易于使用/实施

根本不是真的.这一切都取决于您组织和记录您的应用程序的程度.REST不会神奇地使您的应用程序更好.

  • "REST不能帮助你组织事情.它会强迫你使用你正在使用的服务器端库支持的API." 我不确定你的意思.在不使用额外的服务器端框架的情况下创建RESTful API是完全可能的(并且不比构建非REST API困难). (4认同)
  • 通常休息api更容易缓存,因为您将数据分离到具有相同生命周期的资源(同时创建和更新),以便您可以可靠地缓存和缓存破坏 - 而非-rest-apis通常返回具有相同生命周期的数据经过大量后期处理或是多个实体的集合,使其更难缓存 (2认同)
  • 纠正它不是互相排斥的(你可以有一个可缓存的非休息api)但是采用api设计的休息方法鼓励并且在实践中它肯定是相关的,因为它鼓励各种最佳实践(可发现性,通用接口,可配置性,智能资源建模) ) (2认同)
  • "使用REST,您需要额外的通信层" - 欺骗,您可以使用现有的HTTP库. (2认同)
  • 我很难过这么多人赞成这个。您的建议是 HTTP 具有缓存标头……好吧,HTTP 正在使用 REST 原则。这就是 REST 很棒的原因。REST 不是扩展 HTTP 的东西.. REST 只是对网络协议的一系列要求,HTTP 符合哪些...以及我们的 API 应该符合哪些,因为 HTTP 很好,为什么要重新发明轮子而不是让我们的 API 利用 HTTP 功能并保持 RESTful .. duhhh..... 我不能停止添加更多的点.... (2认同)

Dar*_*ler 22

恕我直言,REST支持的最大优势是减少客户端/服务器耦合.在不破坏现有客户端的情况下,随着时间的推移发展REST接口要容易得多.

  • 你举个例子吗?谢谢! (4认同)
  • 这取决于你的非REST API是如何被贬低的? (3认同)

Bop*_*reH 13

可发现

每个资源都有对层次结构或链接中其他资源的引用,因此可以轻松浏览.这对于开发客户的人来说是一个优势,使他/她不必经常咨询文档并提供建议.它还意味着服务器可以单方面更改资源名称(只要客户端软件不对URL进行硬编码).

与其他工具的兼容性

您可以通过CURL进入API的任何部分,或使用Web浏览器导航资源.使调试和测试集成更容易.

标准化动词名称

允许您指定操作,而无需搜索正确的措辞.想象一下,如果OOP吸气剂和制定者没有标准化,而且有些人使用retrievedefine不是.您必须为每个单独的接入点记住正确的动词.知道只有少数动词可用的计数器有问题.

标准化状态

如果您GET的资源不存在,则可以确保404在RESTful API中出现错误.将它与非RESTful API进行对比,它可以返回{error: "Not found"}包含在上帝知道多少层.如果您需要额外的空间来向另一侧的开发人员写入消息,则可以始终使用响应的正文.

想象一下两个具有相同功能的API,一个遵循REST而另一个不是.现在想象一下这些API的以下客户端:

REST风格:

GET /products/1052/reviews
POST /products/1052/reviews       "5 stars"
DELETE /products/1052/reviews/10
GET /products/1052/reviews/10
Run Code Online (Sandbox Code Playgroud)

HTTP:

GET /reviews?product_id=1052
POST /post_review?product_id=1052                  "5 stars"
POST /remove_review?product_id=1052&review_id=10
GET /reviews?product_id=1052&review=10
Run Code Online (Sandbox Code Playgroud)

现在想想以下问题:

  • 如果每个客户的第一次电话有效,那么你能确定其余部分的工作能力吗?

  • 对API进行了重大更新,可能会也可能没有更改这些访问点.您需要重新阅读多少文档?

  • 你能预测最后一个查询的回报吗?

  • 您必须编辑发布的评论(删除之前).你可以不检查文档吗?


mar*_*cgg 9

我建议看看Ryan Tomayko的"我如何向妻子解释REST"

第三方编辑

摘自waybackmaschine链接:

一个例子怎么样?你是老师,想要管理学生:

  • 他们在哪个班级,
  • 他们得到了什么分数,
  • 紧急联系人,
  • 有关您教授的书籍的信息,等等.

如果系统是基于网络的,那么有可能是每个这里所涉及的名词的网址:student, teacher, class, book, room, etc....如果每个URL都有一个机器可读的表示,那么将新工具锁定到系统上将是微不足道的,因为所有这些信息都可以以标准方式使用.......你可以建立一个全国范围的系统,能够与每个学校系统交谈以收集测试分数.

每个系统都可以使用简单的HTTP GET从彼此获取信息.如果一个系统需要向另一个系统添加内容,它将使用HTTP POST.如果系统想要在另一个系统中更新某些内容,它会使用HTTP PUT.唯一需要弄清楚的是数据应该是什么样子.

  • 这就是为什么我试图发现*为什么*它更好:-) (9认同)
  • 写作已被删除. (7认同)
  • *妻子:*这是另一个机器人的事吗? (6认同)
  • 这是一个很好的文本,但它没有给出任何为什么使用GET和POST为一切都不好的例子. (4认同)
  • @surfen [waybackmachine](http://web.archive.org/web/20080329142936/http://tomayko.com/writings/rest-to-my-wife) (2认同)

小智 5

我建议每个正在寻找这个问题答案的人都看一下这个“幻灯片”

我无法理解 REST 是什么,为什么它如此酷,它的优点和缺点,与 SOAP 的区别 - 但这张幻灯片非常精彩且易于理解,所以现在对我来说比以前更清楚了。