REST APIS真的是RESTful吗?

时间:2015-03-19 17:44:01

标签: api rest http-method httpverbs

我是这个游戏的新手,所以我可能会误解事物。实际上,如果有人告诉我,我误解了事情,那将是一种恩惠。也许这个人会体贴到足以向我展示正确的道路。但...

REST适用于Web服务(http://en.wikipedia.org/wiki/Representational_state_transfer#Applied_to_web_services)的“指南”或“最佳做法”之一就是您应该使用正确的 HTTP方法在进行调用时(我误解了吗?)到REST API。

但是看看网络上的许多API实现,我看到 100%的通话实际上是 GET 调用,具体取决于他们的< strong> URI ,将被API解释为HTTP谓词或方法之一。

因此,例如,查看Twitter(https://dev.twitter.com/rest/public)的REST API文档,其原则上只定义了两个动词/方法(GET和POST),实际上所有调用都以GET形式发送,并且基于在GET调用中的URI上,由API解释并采取行动。

示例:

获取状态/查询https://api.twitter.com/1.1/statuses/lookup.json

POST状态/更新 PUT?):https://api.twitter.com/1.1/statuses/update.json

在这两种情况下,调用本身都是使用GET进行的,URI的最后一部分将其定义为真正的GET或POST。

总而言之,要成为真正的REST,不应该客户端实现的REST API用于Web服务使用正确的HTTP谓词/方法吗?

我错过了什么?

5 个答案:

答案 0 :(得分:8)

你错过了很多,但不要担心,大多数人都是。

事实上,互联网上公开提供的所谓REST API很少是RESTful,主要是因为它们不是hypertext driven。 REST成为了一个引用任何非SOAP的HTTP API的流行语,因此不要仅仅因为它说它是REST API而使API真正成为REST。我建议阅读this回答。

根据我的经验,大多数API开发人员都不知道REST究竟是什么,并且相信任何使用HTTP并避免URI中的动词的HTTP API都是REST。

REST由一组约束定义。其中包括统一接口,简单来说意味着您不应该更改底层协议的预期行为。 REST没有与任何特定协议耦合,但由于它通常与HTTP一起使用,它们有时会变得复杂。

HTTP为GET,POST,PUT,DELETE,PATCH和HEAD方法定义了很好的语义,POST方法的语义由服务器决定。理想情况下,REST API应该完全按照RFC 7231中的规定响应POST以外的方法,但正如您所注意到的,有许多API称自己为REST但不这样做。出现这种情况有很多原因。有时会对正确的语义有一个简单的误解,或者是为了保持一致性,或者是因为与不支持所有方法的中介的向后兼容性以及许多其他原因。

因此,除了正确使用HTTP方法之外,还有很多工作要做真正的RESTful。如果一个API没有达到这个权利,它需要找到另一个流行语,因为它绝对不是REST。

答案 1 :(得分:2)

你是对的。如果他们希望成为&#34; RESTful&#34;,他们的API应该尊重每种HTTP方法的语义。

粗略地说,REST是关于方法信息服务器应该做什么),范围界定信息 where 服务器应该这样做)而且,我几乎忘了提及,超媒体驱动(确保你检查@PedroWerneck's great answer to this question,因为它更多地谈论它,并参考Fielding的博客文章)。

您提到的API在URL中同时包含方法和范围信息。这不太适合RESTful架构,因为它一般来说告诉我们:

  • 1)以正确的方式使用HTTP方法(尊重其属性,例如幂等性等),
  • 2)使用唯一URI来标识唯一资源。

第1点说&#34;使用HTTP方法传达方法信息&#34;并且第2点说&#34;使用URI来传达范围界定信息&#34;。

同样,如果API使用GET与URI中的特定参数来某些东西(而不是获取某些东西),那么它使用URI来传达方法信息

现在,不要惊慌。大多数API都只是RESTful-ish(就像twitter的flickr&#39;),这意味着它们是REST和其他东西之间的动物。这本身并不坏,只是意味着他们不会完全受益于RESTful架构(和HTTP)必须提供的东西。

请记住,RESTful不仅仅是时尚问题,它确实有其好处,例如状态,可压缩性等。而那些只能通过使用它们应该使用的HTTP动词来完全实现。


关于使用POST代替PUT,考虑到它们具有不同的属性(PUT是幂等的,POST不是),它不是使用POST,只要它是统一设计的,也就是说,程序员不应该想知道POST将对API中的每个URI做什么:它们都应该表现相同。 (PUT并没有受到影响,因为它已经是统一的了。)我在another question (check out the "Wrapping Up" part)中引用了罗伊菲尔丁的话,对此进行了更多的讨论。

答案 2 :(得分:2)

我无法确切地说出你的问题是什么,但我相信有一些概念可以帮助你。请允许我详细说明......

许多API在其API中使用有限数量的HTTP“动词”,这是正确的。 GET / POST是最常见的。 PUT不那么,然后所有其他(DELETE,HEAD,OPTIONS等)与消失的概率一起使用。

用于文件上传的

Dropbox Core API允许可选的PUT / POST,其声明的原因是“为了兼容浏览器环境,POST HTTP方法也被识别。”

确实,限制是浏览器。流行的Web服务器对所有HTTP请求方法都没有问题,甚至可以组成。毕竟,请求方法只是关于Web服务器的一些字符串。

HTML4和HTML5仅允许表单请求的GET和POST请求。如果你想让你的API完全通过浏览器使用 - 嘿,为什么不能,这听起来很有用 - 那么你只能使用GET / POST。有关此问题的有用讨论,请参阅:https://softwareengineering.stackexchange.com/questions/114156/why-are-there-are-no-put-and-delete-methods-on-html-forms

进一步复杂化的事实是REST不是行业标准。没有RFC,ISO或其他文档详细说明“符合”的实现必须和不应该做什么。虽然许多人一直在玩与REST相关的概念,但REST概念在PhD disseration of Roy Fielding中被“发明”了。如果您对这些事情感兴趣,那就太棒了。

是的,根据REST,API应该使用正确的动词。但是,只要文档清晰且所有GET请求都是幂等的,那么生活应该继续顺利进行。

(来源:我写过PipeThru.com,它集成了40多个API,包括Dropbox和Twitter)

答案 3 :(得分:1)

我认为此链接可以为您提供有关RESTful服务/ Web API设计的一些提示:https://templth.wordpress.com/2014/12/15/designing-a-web-api/

很明显,并非所有声称都是RESTful的Web服务都是RESTful; - )

简而言之,RESTful服务应该利用HTTP方法来实现它们的目的:

  • 方法GET:返回资源的状态
  • 方法POST:执行操作(在资源列表中创建元素,......)
  • 方法PUT:更新资源的完整状态
  • 方法PATCH:部分更新资源状态
  • 方法DELETE:删除资源

您还需要注意他们可以在不同级别申请,因此方法不会做同样的事情:

  • 列表资源(例如,路径/elements
  • 元素资源(例如,路径/elements/{elementid}
  • 元素资源的字段(例如,路径elements/{elementid}/fieldname)。这样可以方便地管理具有多个基数的字段值。您不必发送字段的完整值(整个列表),但可以添加/删除元素。

另一个重要的事情是利用HTTP标头。例如,内容协商的标题Accept ...

我发现Github的Web API设计得很好,文档也很棒。您可以浏览它以使您成为一个想法。请在此处查看其文档:https://developer.github.com/v3/

希望它可以帮到你, 亨利

答案 4 :(得分:0)

考虑查看REST Richardson Maturity Model主题。

此规范是关于RESTful特定API的数量:

等级0: 对描述性URL的简单GET和POST请求

/ getUserByName?名称=格雷格

等级1: 划分资源中的所有内容并定义资源组中的操作

/用户/ GetByName方法?名称=格雷格

等级2: 正确使用HTTP动词。

GET / user / Greg

等级3: 使用超媒体控件

interent中的不同API实现了REST的不同成熟度级别。这就是为什么有些API不支持所有HTTP功能的原因。