8.1 远程API方式

在构建客户端-服务器架构时,所有程序员都会犯同样的错误。他们开始将对服务器的请求视为方法调用

您想在服务器上启动报告生成过程,为什么不向它发送如下请求:

http://server.com/startDocumentGeneration?params

报告完成后如何下载?为此,我们将编写另一个方法:

http://server.com/getDocument

服务器中HttpSession存储了我们文档的信息,一旦文档生成,服务器就会将其返回。

很棒的方法。或不?

这种做法真的很糟糕。问题是服务器必须记住文档编号。换句话说,为了正确处理新的方法调用,服务器必须记住调用以前方法的结果。

在网络上,这是一个大问题。互联网可能消失,浏览器可能关闭。页面可能会被重新加载或不小心点击链接等。服务器将继续存储以前用户请求的数兆字节数据......

为了舒适地使用服务器,您不能指望手头总是有以前向服务器发出的请求的数据。

那么如何调用服务器的方法呢?正确的答案将是可怕的:不可能!

8.2 REST 方法

程序员回到基础并记住最初请求包含服务器上文件的路径:

http://server.com/path?params

我们决定最大限度地使用这种方法。

现在,服务器被视为以树的形式对外部可见的数据存储库。

如果要获取所有用户的列表,请调用查询:

http://server.com/users

如果要获取用户 113 的数据,请运行查询:

http://server.com/users/113

依此类推,都是一脉相承。

再一次,服务器被视为一个数据存储库,以树的形式对外部可见。

可以接收数据-GET请求、修改-POST请求和删除-DELETE请求。

8.3 无状态

客户端和服务器之间交互的 REST 协议需要满足以下条件:在客户端请求之间的时间段内,服务器上没有存储有关客户端状态的信息。

来自客户端的所有请求都必须以这样一种方式精心设计,即服务器每次都能收到完成请求所需的所有信息。会话状态保存在客户端。

在处理客户端请求期间,客户端被认为处于过渡状态。每个单独的应用程序状态都由可以在下次客户端点击时调用的链接表示。

8.4 接口统一性

用于从服务器检索对象的所有路径都是标准化的。这非常方便,尤其是当您从其他 REST 服务器获取数据时。

所有的对象接口都必须符合三个条件:

资源识别

所有资源都在使用 URI 的请求中标识。服务器内部的资源与返回给客户端的视图是分开的。例如,服务器可能以 HTML、XML 或 JSON 格式从数据库发送数据,这两种格式都不是服务器内的存储类型。

通过视图操作资源

如果客户端存储了资源的表示,包括元数据,那么它就有足够的信息来修改或删除服务器上的资源。

“自我描述”消息

每条消息都包含足够的信息以了解如何处理它。比如你需要用户的信息,那么服务器会返回给你一个JSON对象,里面会有name,address字段。

不应该出现客户端需要知道响应中的第一个数字是年龄,第二个是出生日期的情况。

8.5 缓存

REST 方法假定数据请求是通过 HTTP 协议发出的。因此,通过调用 GET 请求获取对象。这意味着它们与通过 GET 请求接收的所有资源一样,受缓存 HTTP 资源的所有规则约束。

也就是说,通过 REST API 接收的数据以与 Web 服务器上的任何静态资源相同的方式缓存。美丽 :)