【发布时间】:2009-11-07 22:33:10
【问题描述】:
对于一个网站,我正在定义一个 RESTful API。我相信我使用正确的资源 URI 和正确使用 GET/POST/UPDATE/DELETE (大部分)正确。
但是有一点我无法完全弄清楚在 REST 中“执行”的正确方法是什么 - 比较列表。
假设我有一家书店,客户可以有一个愿望清单。愿望清单由书籍(它们的完整书籍记录,即名称、概要等)组成,并且该清单的完整副本存在于客户端上。设计 RESTful API 以允许客户端查询其本地愿望清单的正确性(即了解在服务器端的愿望清单上添加/删除了哪些书籍)的好方法是什么?
一种选择是从服务器下载完整的愿望清单并在本地进行比较。然而,这是一个相当大的数据量(由于嵌入的内容),这是一个低带宽连接的移动客户端,所以这会导致很多问题。
另一种选择是不下载整个愿望清单(即不包括图书信息),而只下载图书标识符的列表。这将不会有太多数据(与前一个选项相比),客户端可以在本地比较列表。但是,要获得新添加书籍的完整书籍记录,必须为每一本新书籍进行 REST 调用。同样,由于这是一个网络连接不良的移动客户端,这可能会出现问题。
我最喜欢的第三个选项是客户端将其标识符列表发送到服务器,服务器将其与愿望清单进行比较,并返回删除的书籍和添加的书籍数据。这将意味着一次往返,并且只有必要的数据量。由于愿望清单的大小估计少于 100 个条目,因此仅发送 ID 将是最少量的数据(~0.5kb)。但是我不知道什么样的调用是合适的——它不能是 GET,因为我们正在发送数据(并且把它全部放在 URL 中感觉不对),它不能像我们一样是 POST/UPDATE不改变服务器上的任何东西。显然也不是 DELETE。
您将如何实施这第三个选项?
附带问题:您将如何解决这个问题(即为什么选项 3 愚蠢或有什么更好、更简单的解决方案)?
谢谢。
P.S.:第四个选项是实现一个更复杂的协议,服务器跟踪列表的更改(添加/删除),客户端可以例如根据版本标识符或简单的时间戳查询更改。但是我更喜欢第三种选择,因为它在实现方面更简单,在客户端和服务器上更不容易出错。
【问题讨论】:
-
除非我弄错了,否则我相信 REST 哲学在其范围内不包括“命令”(因此您的选项 #3 不是 REST-ful)。基于 REST 的接口更类似于“文档管理”接口:创建、删除、更新、检索“部分”等。
-
只有 Roy Fielding 创建了真正宁静的 API,可惜他从未告诉其他人如何去做。
标签: rest