显然,REST只是一组关于如何使用HTTP的约定.我想知道这些惯例提供了哪些优势.有人知道吗?
我认为你不会得到一个好的答案,部分原因是没有人真正同意REST 是什么.在维基百科页面是关于解释流行语和轻重.讨论页面值得一试,只是为了看看有多少人不同意这一点.据我所知,REST意味着:
而不是随机命名的setter和getter URL和使用的GET
所有的getter和POST
所有制定者,我们希望拥有的URL标识资源,然后使用HTTP动作GET
,POST
,PUT
和DELETE
做的东西给他们.而不是
GET /get_article?id=1 POST /delete_article id=1
你会的
GET /articles/1/ DELETE /articles/1/
然后POST
和PUT
对应于"创造"和"更新"操作(但没有人同意哪一种方式圆).
我觉得缓存参数是错误的,因为查询字符串的一般缓存,再说你不是真的需要使用它们.例如,django很容易做到这一点,我不会说它是REST:
GET /get_article/1/ POST /delete_article/ id=1
或者甚至只在URL中包含动词:
GET /read/article/1/ POST /delete/article/1/ POST /update/article/1/ POST /create/article/
在这种情况下GET
意味着没有副作用的POST
东西,并且意味着改变服务器上的数据.我想,这也许是有点更清晰,更容易,尤其是当你能避免整个PUT
航班吗POST
事情.另外,如果您愿意,可以添加更多动词,因此您不会被人为地绑定到HTTP提供的内容.例如:
POST /hide/article/1/ POST /show/article/1/
(或者无论如何,在它们发生之前很难想到它们!)
总而言之,我只能看到两个优势:
您的Web API可能更清晰,更易于理解/发现.
在与网站同步数据时,使用REST可能更容易,因为您可以说synchronize("/articles/1/")
或其他什么.这很大程度上取决于您的代码.
不过我觉得有一些很大的缺点:
并非所有操作都可以轻松映射到CRUD(创建,读取/检索,更新,删除).您甚至可能没有处理对象类型资源.
对于可疑的好处,这是额外的努力.
分不清哪些方式轮PUT
和POST
是.在英语中,它们意味着类似的东西("我打算在墙上发布/发布通知.").
总而言之,我会说:除非您真的想要付出额外的努力,或者如果您的服务非常适合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/ ....
这有点荒谬.Facebook的API非常棒IMO,所以让我们看看他们做了什么:
默认情况下,进行查询时会返回大多数对象属性.您可以使用"fields"查询参数选择要返回的字段(或连接).例如,此URL仅返回Ben的id,name和picture:https://graph.facebook.com/bgolub?fields = id,name,picture
我不知道你怎么用REST做这样的事情,如果你做了它是否仍然算作REST.我肯定会忽略那些试图告诉你你不应该这样做的人(特别是如果原因是"因为它不是REST")!
简而言之,REST意味着使用HTTP的方式.
看看Roy Fielding关于REST的论文.我认为每个正在进行Web开发的人都应该阅读它.
作为一个说明,Roy Fielding也是HTTP协议背后的关键驱动因素之一.
列举一些优点:
简单.
您可以充分利用HTTP缓存和代理服务器来帮助您处理高负载.
它可以帮助您将非常复杂的应用程序组织成简单的资源.
它使新客户可以轻松使用您的应用程序,即使您没有专门为他们设计(可能是因为他们在您创建应用程序时不在身边).
简单地说:没有.
请随意关注,但我仍然认为与非REST HTTP相比没有任何实际好处.所有当前答案均无效.目前投票最多的回答是:
简单.
您可以充分利用HTTP缓存和代理服务器来帮助您处理高负载.
它可以帮助您将非常复杂的应用程序组织成简单的资源.
它使新客户可以轻松使用您的应用程序,即使您没有专门为他们设计(可能是因为他们在您创建应用程序时不在身边).
1.简单
使用REST,您需要为服务器端和客户端脚本提供额外的通信层=>它实际上比使用非REST HTTP更复杂.
2.缓存缓存可以由服务器发送的HTTP标头控制.REST不会添加非REST中缺少的任何功能.
3.组织REST不能帮助您组织事情.它强制您使用您正在使用的服务器端库支持的API.使用非REST方法时,可以以相同的方式(或更好)组织应用程序.例如,请参阅模型 - 视图 - 控制器或MVC路由.
4.易于使用/实施根本不是真的.这一切都取决于您组织和记录您的应用程序的程度.REST不会神奇地使您的应用程序更好.
恕我直言,REST支持的最大优势是减少客户端/服务器耦合.在不破坏现有客户端的情况下,随着时间的推移发展REST接口要容易得多.
每个资源都有对层次结构或链接中其他资源的引用,因此可以轻松浏览.这对于开发客户的人来说是一个优势,使他/她不必经常咨询文档并提供建议.它还意味着服务器可以单方面更改资源名称(只要客户端软件不对URL进行硬编码).
您可以通过CURL进入API的任何部分,或使用Web浏览器导航资源.使调试和测试集成更容易.
允许您指定操作,而无需搜索正确的措辞.想象一下,如果OOP吸气剂和制定者没有标准化,而且有些人使用retrieve
而define
不是.您必须为每个单独的接入点记住正确的动词.知道只有少数动词可用的计数器有问题.
如果您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
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
现在想想以下问题:
如果每个客户的第一次电话有效,那么你能确定其余部分的工作能力吗?
对API进行了重大更新,可能会也可能没有更改这些访问点.您需要重新阅读多少文档?
你能预测最后一个查询的回报吗?
您必须编辑发布的评论(删除之前).你可以不检查文档吗?
我建议看看Ryan Tomayko的"我如何向妻子解释REST"
摘自waybackmaschine链接:
一个例子怎么样?你是老师,想要管理学生:
他们在哪个班级,
他们得到了什么分数,
紧急联系人,
有关您教授的书籍的信息,等等.
如果系统是基于网络的,那么有可能是每个这里所涉及的名词的网址:student, teacher, class, book, room, etc
....如果每个URL都有一个机器可读的表示,那么将新工具锁定到系统上将是微不足道的,因为所有这些信息都可以以标准方式使用.......你可以建立一个全国范围的系统,能够与每个学校系统交谈以收集测试分数.
每个系统都可以使用简单的HTTP GET从彼此获取信息.如果一个系统需要向另一个系统添加内容,它将使用HTTP POST.如果系统想要在另一个系统中更新某些内容,它会使用HTTP PUT.唯一需要弄清楚的是数据应该是什么样子.