获取集合时 return 的详细信息是否 (In)-RESTful?
Is it (Un)-REST-full to return details when GET-ing the collection?
我的问题是关于设计用于获取集合中项目列表的端点。我的理解是,集合上的 GET return 是该集合中项目的列表,但没有关于这些的详细信息。
资源 ID 列表对人类来说不是很好,因此 GUI 前端随后会请求集合中每个项目的详细信息。
如果集合是 "users",那么集合上的 GET 只是 return 用户 ID 列表(全部!我想是分页?)
然后 GUI 请求每个 ID 的详细信息,并使用它来填充界面。对于列表,您可能会说,例如,在此界面中仅显示用户的全名和电子邮件地址,允许用户 select 一个以查看更多详细信息。
现在我认为,如果 "list retrieve" return 编辑的不仅仅是 ID,那么在客户端和 API 之间会节省很多时间,可能包括每个项目的 ID、全名和电子邮件地址。
这会破坏 RESTful-ness 吗?在单个请求中 return 有多少细节停止?您是否允许客户端指定将哪些属性包含在请求中?
"searching" 集合呢?您是否允许在 GET 上针对集合指定参数以 "filter" 结果?
API 的存在是为了满足客户的需求。如果您的客户需要详细信息,您应该 returning 他们。
也就是说,对于高度可缓存的项目需要权衡。如果列表不是静态的但内容是静态的,那么 returning link 的列表可能会更好。然后客户端对每个元素进行一次调用,并将它们放在缓存中。稍后对这些元素的调用由中间缓存提供服务,该缓存位于客户端或客户端与服务器之间的某个位置。这将减少对列表的调用的总体带宽,但首先会以更大的绝对调用次数为代价。
另一个选项是支持像?include=id, full-name, email
这样的查询参数。默认情况下只是 return 自我 link,但客户可以指定他们希望在返回的表示中填充哪些属性。如果您支持此查询参数,我建议默认只 returning 最重要的信息。
就馆藏搜索而言,这取决于搜索的性质和复杂程度。查询参数是一种选择。使用 POST
到搜索端点并在正文中发送搜索条件也是合理的,特别是如果您的 url 可能超过 2k 个字符(某些浏览器的默认 url 长度限制).您也可以通过这种方式保存搜索 - 让 POST
在服务器上创建搜索条件资源,并让客户端 GET /widgets?search-criteria=<id>
.
我的问题是关于设计用于获取集合中项目列表的端点。我的理解是,集合上的 GET return 是该集合中项目的列表,但没有关于这些的详细信息。
资源 ID 列表对人类来说不是很好,因此 GUI 前端随后会请求集合中每个项目的详细信息。
如果集合是 "users",那么集合上的 GET 只是 return 用户 ID 列表(全部!我想是分页?)
然后 GUI 请求每个 ID 的详细信息,并使用它来填充界面。对于列表,您可能会说,例如,在此界面中仅显示用户的全名和电子邮件地址,允许用户 select 一个以查看更多详细信息。
现在我认为,如果 "list retrieve" return 编辑的不仅仅是 ID,那么在客户端和 API 之间会节省很多时间,可能包括每个项目的 ID、全名和电子邮件地址。
这会破坏 RESTful-ness 吗?在单个请求中 return 有多少细节停止?您是否允许客户端指定将哪些属性包含在请求中?
"searching" 集合呢?您是否允许在 GET 上针对集合指定参数以 "filter" 结果?
API 的存在是为了满足客户的需求。如果您的客户需要详细信息,您应该 returning 他们。
也就是说,对于高度可缓存的项目需要权衡。如果列表不是静态的但内容是静态的,那么 returning link 的列表可能会更好。然后客户端对每个元素进行一次调用,并将它们放在缓存中。稍后对这些元素的调用由中间缓存提供服务,该缓存位于客户端或客户端与服务器之间的某个位置。这将减少对列表的调用的总体带宽,但首先会以更大的绝对调用次数为代价。
另一个选项是支持像?include=id, full-name, email
这样的查询参数。默认情况下只是 return 自我 link,但客户可以指定他们希望在返回的表示中填充哪些属性。如果您支持此查询参数,我建议默认只 returning 最重要的信息。
就馆藏搜索而言,这取决于搜索的性质和复杂程度。查询参数是一种选择。使用 POST
到搜索端点并在正文中发送搜索条件也是合理的,特别是如果您的 url 可能超过 2k 个字符(某些浏览器的默认 url 长度限制).您也可以通过这种方式保存搜索 - 让 POST
在服务器上创建搜索条件资源,并让客户端 GET /widgets?search-criteria=<id>
.