你如何避免固定资源

你如何避免固定资源

问题描述:

Roy Fielding writes你如何避免固定资源

一个REST API一定不能定义固定 资源名称或层次结构(客户端和服务器 的 明显的耦合)。服务器必须有* 来控制自己的名字空间。 相反,允许服务器指示如何构建 相应的URI 客户,如在 HTML表单和URI模板完成后,由 定义内 媒体类型和链接关系的说明。

你如何做到这一点系统到系统接口?假设客户想要在服务器上创建一个订单http://my.server.org它应该如何知道创建订单时应该使用网址http://my.server.org/newOrder而不是http://my.server.org/nO或其他任何东西?

对于人机界面(即浏览器),我猜服务器会提供某种形式的链接(可能在form元素中),并且该链接中的文本会告诉用户该页面上的哪些表单是正确的一个用于创建订单(应该是创建用户或导航到某个搜索结果)

用于在客户端实现此操作的机制是什么?还有:他们实际上是使用了还是大多数人只是把这些网址连接到客户端?

你如何做到这一点 系统到系统的接口?说 客户想在http://my.server.org创建于 服务器的顺序如何 它应该了解到,用于创建 它应该使用的URL订单 http://my.server.org/newOrder,而不是 http://my.server.org/nO或任何其他 ?

它不学习。机器客户通常不能“学习”。至少还没有,我们还在天网之前。你必须“教”他们。

但关键是你不教他们的网址。你教他们的关系。

请考虑,在HTML中...

<a rel="order" href="http://my.server.org/newOrder"/> 

<a rel="order" href="http://my.server.org/nO"/> 

你会发现,相对是一样的, “订单”,但网址并非如此。

在一个“完美”的世界里,你的系统将有一个入口点,比如http://my.server.org/,从那里客户可以找到它需要知道的所有资源。

实际上,许多系统都有几个“众所周知的”,并且定义了入口点,客户端可以从这些入口点开始,这只是一种权宜之计,所以客户端并不必须从系统的根部开始。这些众所周知的入口点暗示了供应商的承诺,即这些URL不会很快改变。他们已经很久了,服务器会很好地支持他们。

但是一旦通过入口点,您发现的任何URL都可能没有这样的承诺。该网址可以是只能使用一个网址的网址。它可以针对不同的机器进行负载平衡。谁知道。但作为服务的消费者,你真的不关心网址是什么,你只关心关系。关系告诉你要使用的URL的详细信息。

您的超媒体API文档解释了如何将统一界面应用到您的客户将遇到的每个rels。客户不能“直觉”,要么教它。

基本上,通过教导客户端如何浏览它会或可能在负载中找到的关系,它处理的是客户端如何操作超媒体API。有效载荷包含标志帖子以显示方式,但服务器指定这些标志帖子的位置。

至于多久使用它,在机器到机器的世界里,可能不是很多。大多数系统的URL不够大,URL变化不够重要,客户数量太少,以至于更换客户端并不是一项重大负担。所以大部分只是硬编码。

但是,最后,你只是有坏客户。一个REST系统可以用坏客户端做什么。无论如何,它无法在运行时将它们分开。

+0

+1 - 我想在我的答案中增加一个“使用AI”选项,但我觉得这有点荒谬;)很高兴你在这里解决它。 – 2011-06-11 07:00:54

无论您如何发布API(要被机器使用),都有可能做出重大改变。当您将API包装到UI(如HTML表单)后面时,您可以*更改URI而不会中断用户,但这是因为用户正在使用您提供的抽象。在不更改表单的情况下更改URL架构,并且仍会破坏客户端。

几种方法,以避免破坏机客户端(基本上,支持向后兼容):在某种URL版本的

  • 构建
  • 从旧的URL模式
  • 待办事项重定向到新的架构

我们已经非常成功地以如下方式接近它:在应用程序的根URL上公开WADL文件,描述媒体类型以及在其中查找链接的位置及其语义。我知道这个(WADL)在REST社区中被某些人认为是非常重要的,但我总是只被WADL的URL焦点所吓倒。除了所有的宗教辩论之外,我们喜欢有一个明确的文件表述方式。有一种方法可以避开WADL的URL焦点,而是指出可以在表示中找到哪些链接,然后将其记录下来。有关该方法的详细信息,请参阅that blog post(由于维护原因,因此您可能需要查看Google cache)。

这会导致客户端只能找到一个URL,因为他可以找到有关它访问WADL的信息,从此只需了解表示形式以及在哪里可以找到链接,什么HTTP方法需要什么参数被调用等。

+0

很高兴看到有人使用WADL进行资源的动态运行时发现。就我个人而言,我认为在很多情况下,标准的支持媒体类型的媒体类型足以用于发现,但WADL绝对是这种情况下的有效选择。 – 2011-06-11 15:57:25

+0

绝对。唯一的细节是确保WADL提供某种契约和TTL,因此客户对WADL文档及其提供的链接有效期限有一些期待。我不能说在一个细粒度的级别(每个资源和活动使用不同的WADL)和描述服务集合的较大的元文档中使用WADL是否合理。 – 2011-06-11 21:58:34

+0

看起来WADL并没有真正设计为首先指向表示内的链接(因此参数元素的用法相当尴尬)。可能值得向其下一个版本提出建议。 我们通常每个应用程序都有一个WADL文件,否则重复查询和解释WADL文件的开销会很高。使用WADL这种方式对于SOAP机器可读的API文档问题是一种很好的回答,您甚至可以从中生成代码,但仍然遵循REST准则,甚至包含HATEOAS特性。 – 2011-06-13 19:32:22