用于更新树层次结构中节点父级的 REST API 设计

Posted

技术标签:

【中文标题】用于更新树层次结构中节点父级的 REST API 设计【英文标题】:REST API design for updating the parent of a node in tree hierarchy 【发布时间】:2019-05-09 05:02:57 【问题描述】:

我有三个具有以下结构的数据库表:

Country
id | name  

State
id | name | country_id

City
id | name | state_id

这些的现有 REST 端点 URL 是:

/country                                                For list of all countries
/country/country_id                                   For a specific country
/country/country_id/state                             For list of all states in a country
/country/country_id/state/state_id                  For a specific state
/country/country_id/state/state_id/city             For list of all the cities in a state of a country
/country/country_id/state/state_id/city/city_id   For a specific city

现在我需要将一个城市从一个州移动到另一个州,我应该如何为这个操作设计 REST Endpoint?建议。

【问题讨论】:

【参考方案1】:

我需要将一个城市从一个州移动到另一个州,我应该如何为此操作设计 REST Endpoint?

据我所知,这里没有很好的答案。

一个常用的启发式方法是考虑如何在网站上执行此操作:您将加载一些表单,使用输入控件来描述您的更改,提交表单,然后 http 客户端将POST 表单数据到服务器指定的某个 URI。

所以这部分很简单——URI 可以是“任何东西”,因为客户端并不关心;它只是使用表单中的 URI。

服务器将接收消息并进行处理。改变其他资源的副作用是可能的,由服务器自行决定,所以没关系。

但是缓存的故事不是很好。 “移动”一个城市的请求的语义改变了源状态、目标状态,也许还有城市本身的表示。我们可以安排表单,使这些资源中的任何一个因成功响应而失效(只需使用该标识符作为请求的目标),但我们没有任何标准化机制来使其他资源失效。

如果整个树层次结构由单个资源描述,那么就没有问题 - 那将是我们无效的一个资源。

(想象一下 wikipedia - 您更改了 Boston 的页面,这也更改了 Massachusetts 的页面。没有标准的方法可以告诉客户 两个 页面都已更改。 )

【讨论】:

以上是关于用于更新树层次结构中节点父级的 REST API 设计的主要内容,如果未能解决你的问题,请参考以下文章

jacascript DOM节点——节点关系与操作

如何返回表单最高父级的名称

获取满足条件的直接父级的 SQL 查询

使用MySQL 8.0递归CTE查找层次结构表中的直接后代并传播给父级

树中路径上的范围查询

当父级的大小减小时,哪些自动布局约束允许子视图压缩到 0 大小?