围绕 REST 存在很多混淆和误解。不幸的是,与真正的 REST 应用程序相比,发现执行与 REST 含义完全相反的应用程序并称自己为 RESTful 的情况要常见得多。
据我了解,这只是在 API 中编写函数的约定?
不,REST 不仅是在 API 中编写函数的约定,也与此处其他答案所说的 SOAP 或 HTTP 直接相关。 REST 是一种软件架构风格,其灵感来自为 Web 本身做出的成功设计决策。简单来说,REST API 应该像网站一样工作。
当您进入一个网站时,您会进入一个主页,了解该网站的内容,HTML 文档将包含指向您所需资源的超链接。唯一的带外信息是资源本身的媒体类型,而不是如何找到它们。例如,当您进入 StackOverflow 时,您就知道问题和答案是什么,并寻找指向它们的链接。您的浏览器如何呈现这些链接、您如何选择和关注它们与其他网站(如电子邮件或新闻网站)没有什么不同。它的不同之处在于您所追求的资源的媒体类型。
这就是 REST API 的工作方式。除了详细说明资源的作用之外,客户端不应依赖任何带外信息。他们应该连接到一个主页,该主页返回他们应该遵循的链接来做他们需要的任何事情。如果 API 不这样做,那么它就不是 REST。期间。
我喜欢将这些 API 称为“street-REST”,因为人们经常通过复制他们在其他也称自己为 REST 的 API 中看到的内容以及其他人谈论 REST 的内容来实现它们。
所有函数都应该是 GET/POST/DELETE/PUT 形式?
这是一个常见的混淆,你会看到很多,包括人们将其与 CRUD 操作混为一谈,或者 REST 不允许任何其他动词等。这很牛。
REST 独立于任何特定协议,因此说函数应该遵循 HTTP 方法是没有意义的。 REST 将您的应用程序限制在一个统一的接口中,这意味着无论您应该使用什么协议,您都必须尽可能地坚持标准化的行为。如果您通过 HTTP 实现 REST 应用程序,这意味着您的 API 必须坚持使用 HTTP 方法进行客户端-服务器交互,这意味着您不能像某些使用 HTTP 的应用程序那样发明其他 HTTP 方法。如果您更改通信协议,客户端需要在输入您的 API 之前知道该信息,这就是更多的带外信息。
如何在代码中实现这一点与 REST 无关。 REST 不是一种开发模式或哲学,而是一种架构风格。
我主要对 JSON/XML 如何在其中发挥作用感到困惑?
对此也有很多困惑。在 REST 应用程序中,您应该使用描述您需要的所有行为的 states 定义抽象实体。 API 将用作在客户端和服务器之间传输这些实体的媒体类型表示的渠道。 REST 表示具象状态转移。客户端请求的 URI 是该资源的标识符,该请求的元数据将告诉服务器客户端准备接受哪些媒体类型。 JSON/XML 在 REST 中根本没有任何直接作用。它们只是一种表示媒体类型,与文本/html 等格式相比,它更容易让计算机解析和获取信息,而文本/html 旨在通过浏览器呈现以供人类可视化。
以 StackOverflow 本身为例。抽象意义上的问题是什么?这是一个信息请求。该抽象资源是如何正式定义的?有作者,有被问问题的实际文本,有赞成票和反对票,cmet 和可能的答案等,所有这些也是具有自己定义的抽象资源。实际数据存储在某处的数据库中,当您请求主页时,它会返回带有标识这些问题的 URI 的链接。以这个问题为例,它的 URI http://stackoverflow.com/questions/24092517。当我想在浏览器上呈现的漂亮文档中阅读该问题时,我将请求该 URI,但通过 Accept 标头告诉服务器我想要 text/html 表示,并且我的浏览器知道如何呈现 HTML变成漂亮的一页。另一方面,当我想请求将该问题存储回数据库时,例如,我不需要呈现漂亮文档页面所需的所有可爱的东西,所以我要求一种更容易解析和不包含很多不必要的信息,例如 JSON 或 XML。
大多数构建 street-REST API 的人都理解这一点,但他们忽略了最有趣的部分,那就是您不仅限于已经存在的媒体类型。您可以创建仅存在于您的 API 或您公司的应用程序生态系统中的私有媒体类型。因此,例如,不是调用所有 JSON 文档的媒体类型application/json,无论它们的内容是什么,我们都可以拥有更准确地反映该特定资源类型的自定义媒体类型。因此,对于以 JSON 格式表示的 StackOverflow 问题,我们可以有一个 application/vnd.stackoverflow.question.v1+json。一旦你这样做了,而不是浪费时间记录通信协议已经标准化的操作,你应该专注于记录自定义媒体类型以及如何与之交互,独立于通信协议。一旦你明白这一点,客户就可以使用任何可用的协议与你的服务进行交互。
如果您了解这三个要点,您就了解 REST 是什么。通过使用超链接作为应用程序状态的引擎,您不会被绑定到任何特定的实施时间点。您的服务器可以随意发展,您可以随意更改 URI,并且客户端不会中断。通过坚持标准化的协议,通用客户端更容易使用您的 API,更不用说如果开发人员已经知道您不会破坏协议,他们更容易理解如何集成。通过将您的设计和文档工作集中在您的媒体类型上,而不是协议细节和 URI 语义上,您可以避免引入更多驱动 API 所需的带外信息,并且您的客户也更能适应变化。