> For the complete documentation index, see [llms.txt](https://potoyang.gitbook.io/spring-in-action-v4/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://potoyang.gitbook.io/spring-in-action-v4/di-16-zhang-shi-yong-spring-mvc-chuang-jian-rest-api/untitled-4/untitled-1.md).

# 16.1.1　REST 的基础知识

当谈论 REST 时，有一种常见的错误就是将其视为 “基于 URL 的 Web 服务” —— 将 REST 作为另一种类型的远程过程调用（remote procedure call，RPC）机制，就像 SOAP 一样，只不过是通过简单的 HTTP URL 来触发，而不是使用 SOAP 大量的 XML 命名空间。

恰好相反，REST 与 RPC 几乎没有任何关系。RPC 是面向服务的，并关注于行为和动作；而 REST 是面向资源的，强调描述应用程序的事物和名词。

为了理解 REST 是什么，我们将它的首字母缩写拆分为不同的构成部分：

* 表述性（Representational）：REST 资源实际上可以用各种形式来进行表述，包括 XML、JSON（JavaScript Object Notation）甚至 HTML —— 最适合资源使用者的任意形式；
* 状态（State）：当使用 REST 的时候，我们更关注资源的状态而不是对资源采取的行为；
* 转移（Transfer）：REST 涉及到转移资源数据，它以某种表述性形式从一个应用转移到另一个应用。

更简洁地讲，REST 就是将资源的状态以最适合客户端或服务端的形式从服务器端转移到客户端（或者反过来）。

在 REST 中，资源通过 URL 进行识别和定位。至于 RESTful URL 的结构并没有严格的规则，但是 URL 应该能够识别资源，而不是简单的发一条命令到服务器上。再次强调，关注的核心是事物，而不是行为。

REST 中会有行为，它们是通过 HTTP 方法来定义的。具体来讲，也就是 GET、POST、PUT、DELETE、PATCH 以及其他的 HTTP 方法构成了 REST 中的动作。这些 HTTP 方法通常会匹配为如下的 CRUD 动作：

* Create：POST
* Read：GET
* Update：PUT 或 PATCH
* Delete：DELETE

尽管通常来讲，HTTP 方法会映射为 CRUD 动作，但这并不是严格的限制。有时候，PUT 可以用来创建新资源，POST 可以用来更新资源。实际上，POST 请求非幂等性（non-idempotent）的特点使其成为一个非常灵活的方法，对于无法适应其他 HTTP 方法语义的操作，它都能够胜任。

基于对 REST 的这种观点，所以我尽量避免使用诸如 REST 服务、REST Web 服务或类似的术语，这些术语会不恰当地强调行为。相反，我更愿意强调 REST 面向资源的本质，并讨论 RESTful 资源。
