RESTful网站与RESTful API - 有什么区别,这有关系吗?

时间:2013-12-25 19:10:01

标签: ruby-on-rails api rest web

我一直在阅读很多关于REST的内容,以及如何以“正确的方式”开展REST。大多数资源使用RESTful Web服务或RESTful API等术语,但没有提到RESTful网站。鉴于我认为网站和API是两回事,我对此感到困惑。然而,例如,当使用Rails框架设计网站时,您会不断被提醒有关RESTful一切是(或应该是)的。

我认为REST为API提供了很多优势(它的架构属性)(例如JSON API),但我不知道网站如何从RESTful中获益。作为一个简单的例子考虑登录功能。在REST方式中,可以通过创建一个会话模型来建模,该模型具有与创建新会话相对应的登录,注销销毁会话等等。 URL看起来像这样:

Prefix Verb   URI Pattern                    Controller#Action
    new_user_session GET    /users/login(.:format)         sessions#new
        user_session POST   /users/login(.:format)         sessions#create
destroy_user_session DELETE /users/sign_out(.:format)      sessions#destroy

但是,这些网址不是非常用户友好。从用户的角度来看,只有一个显示登录表单的/ login路径更有意义。它也更容易记住。但是,如果我们将URL映射为那样,那么它们就不再那么真实了。 / login是否识别资源。如果是哪一个?

另一个例子是主页/家或只是/。这如何适合REST?在大多数网站上,主页是许多不同类型信息的混搭,并不识别任何单一资源。例如,它可能是一个页面,列出目录中的最新产品以及您登录的最后日期;两个完全不相关的东西。那RESTful怎么样?

我理解为什么将RESTful API 与网站分开是有道理的,但我的困惑在于REST如何应用于网站 - 如果它甚至可以。

1 个答案:

答案 0 :(得分:26)

简短的回答是没有人谈论RESTful网站,因为默认情况下网站是RESTful的。你真的必须尝试创建一个非RESTful的网站(虽然它已经完成 - 见下文)。

您正在描述的设置需要REST中的大量元素,但它不是" REST"本身:它是为方便服务器端程序员而设计的一组约定。今天的大多数Web API仅使用REST约束的子集,并且它不是包含网站背后的主要驱动原理的子集。

让我回顾一下。以下是网站和Web API的共同点:它们都通过资源公开功能。每个资源都由URL标识,每个资源都响应标准HTTP方法的适当子集。 (这看起来很明显,但请看XML-RPC或SOAP,其中只有整个系统的一个URL。)资源可能会向客户端发送文档(响应GET请求)和/或它可能会接受来自客户端的文档(以及POST或PUT请求)。

现在,差异。 Web API通常将四种最常见的HTTP方法(POST,GET,PUT,DELETE)映射到四个CRUD操作(创建,读取,更新,删除)。网站无法做到这一点,因为网站运行在HTML上,HTML表单只支持两种方法:GET和POST。然而,一个网站可以很容易地描述各种各样的行动 - "搜索","下一页","购买"," unfriend&#34 ; - 这对于映射到CRUD非常重要。

那是因为HTML支持链接和表单。这就是" Web API"家谱的分支。不是资源,而是资源之间的机器可读连接。 (要删除一些REST术语,这是"超媒体约束"或"超媒体作为应用程序状态的引擎。")

" Web API"倾向于忽略超媒体约束,因为a)它很难理解,并且b)JSON不支持链接或形式,因此即使你想要也很难遵守超媒体约束。 (随着JSON-LD,Hydra和HAL等格式的发展,这种情况正在发生变化。)

但超媒体约束实际上是将Web结合在一起的东西。拿走链接和表格,你就会留下无法用尽的混乱局面。

Python Challenge是非RESTful网站的一个很好的例子。你得到a starting URL,然后你必须解决一个小谜题,以弄清楚如何到达序列中的下一个URL。您仍然拥有资源,每个资源都有一个URL。但是资源之间的联系是模糊的。这是一款有趣的游戏,但没有人会以这种方式运行一个严肃的网站。不幸的是,这就是我们在Web API方面所处的位置。"

进一步阅读

正如您所知,这是一个复杂的主题。冒着我自己的号角,the "maturity model"我为2008年的一次演讲开发了可能会帮助你理解万维网(3级)和今天大多数API(2级)之间的架构差异。我还推荐Steve Klabnik的Designing Hypermedia APIs和我自己的RESTful Web APIs,它首先将网络API与完全相同的网站进行比较。

我之前的书RESTful Web Services也涵盖了这个主题,并且可以免费在线阅读。然而,它有些过时(它于2007年发布),回想起来,我认为它不足以推动超媒体的角度。

<强>杂

简要回答原始问题中的几点:

  1. Web API和网站之间没有技术差异。网站是恰好提供HTML文档的Web API。

  2. 一个网址不是更多&#34; RESTful&#34;比另一个。这仅仅是一个可用性问题。在技​​术层面上,您的网址看起来并不重要。 /users/login.json/login以及/the-first-100-prime-numbers.gif都是REST引用登录表单的方式。

  3. 主页是一个资源:它是一个&#34;主页&#34;资源。它的工作是包含最重要的信息,并引导客户端到其他页面 - 直接通过链接,或间接通过搜索表单。资源不一定对应于数据库中的行或对象模型中的对象。资源可以是绝对任何东西,甚至是真实世界的对象或抽象概念。唯一的限制是资源必须具有URL。

  4. /login是一个URL,所以是的,它标识了一个资源。什么样的资源?如果这是发送&#34; GET / login&#34;的典型场景。为您提供一个包含登录表单的HTML页面,然后它就是一个&#34;登录表单&#34;资源。如果填写登录表单会触发&#34; POST / login&#34;请求,然后它还作为一个&#34;登录表单处理器&#34;资源。

  5. 根据对其URL的请求进入时运行的代码而不是尝试将其映射到一个特定的&#34;事物而言,您可能会更好地考虑资源。在您的数据集中。也就是说,不要试图找出资源 的内容,而是根据做什么来考虑它。

    希望这有帮助。