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

 上床后悔_155 发布于 2023-02-08 10:45

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

我认为REST为API提供了许多优势(它的架构属性)(例如JSON API),但我只是看不到网站如何从RESTful中获益.作为一个简单的例子考虑登录功能.在REST方式中,可以通过创建一个会话模型来建模,该模型对应于创建新的sesssion,注销破坏会话等等.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

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

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

我理解为什么将RESTful API与网站分开是有道理的,但我的困惑在于REST如何应用于网站 - 如果它确实如此.

1 个回答
  • 简短的回答是没有人谈论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.然而,一个网站可以很容易地描述各种各样的行动 - "搜索","下一页","购买","不友好" - 这些行动很难映射到CRUD.

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

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

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

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

    进一步阅读

    如您所知,这是一个复杂的主题.冒着自己的号角,我为2008年的演讲开发的"成熟度模型"可能有助于您了解万维网(第3级)与当今大多数API(第2级)之间的架构差异.我还推荐Steve Klabnik的Designing Hypermedia API,以及我自己的RESTful Web API,它首先将Web API与完全相同的网站进行比较.

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

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

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

      一个URL不比另一个URL更"RESTful".这仅仅是一个可用性问题.在技​​术层面上,您的网址看起来并不重要./users/login.json/login并且/the-first-100-prime-numbers.gif都是REST参与登录表单的方式.

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

      /login是一个URL,所以是的,它标识了一个资源.什么样的资源?如果这是一个典型的场景,发送"GET/login"会为您提供一个带有登录表单的HTML页面,那么它就是一个"登录表单"资源.如果填写登录表单会触发"POST/login"请求,那么它也会充当"登录表单处理器"资源.

    根据在其URL请求进入时运行的代码,而不是尝试将其映射到数据集中的某个特定"事物",您可能会更好地考虑资源.也就是说,不是试图找出什么是资源,中的什么方面认为它确实.

    希望这可以帮助.

    2023-02-08 10:47 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有