RESTful端点和数据库关系

RESTful端点和数据库关系,rest,restful-architecture,restful-url,Rest,Restful Architecture,Restful Url,我对RESTful开发是新手。我正在开发一个小应用程序(使用SpringBoot),它显示州、地区和省份的列表。这是我的数据库图: 我在为资源创建端点时遇到问题。 创建这些端点是正确的: /api/states **//List of all countries** /api/states/{id} **//Show the single country** /api/states/{id}/regions **//Show all regions** /api/states/{

我对RESTful开发是新手。我正在开发一个小应用程序(使用SpringBoot),它显示州、地区和省份的列表。这是我的数据库图:

我在为资源创建端点时遇到问题。 创建这些端点是正确的:

/api/states      **//List of all countries** 
/api/states/{id} **//Show the single country**
/api/states/{id}/regions  **//Show all regions**
/api/states/{id}/regions/{id} **//Show the individual region**
/api/states/{id}/regions/{id}/provinces **//Show all provinces**
/api/states/{id}/regions/{id}/provinces/{id} **//Show the individual province**
我意识到我的结束点太长了,我认为这不是正确的过程。 根据你的经验,你能推荐什么建议? 多谢各位

上面的端点是好的

问题存在于嵌套的其余部分。假设区域和省ID是全局唯一的,则可以以相同的方式将它们展平(不包括州)

下面是一个例子:

/api/regions/{id} //Show the individual region
/api/regions/{id}/provinces //Show all provinces
/api/provinces/{id} //Show the individual province
/api/provinces/{id}/towns //Show all towns
上面的端点是好的

问题存在于嵌套的其余部分。假设区域和省ID是全局唯一的,则可以以相同的方式将它们展平(不包括州)

下面是一个例子:

/api/regions/{id} //Show the individual region
/api/regions/{id}/provinces //Show all provinces
/api/provinces/{id} //Show the individual province
/api/provinces/{id}/towns //Show all towns

在某种程度上,我完全同意你:

/api/状态-是,列出所有状态
/api/states/{id}-是,显示一个状态
/api/states/{id}/regions-是的,只是处于该状态的区域

但现在我要走这条路:

/api/regions/{id}-显示一个区域
/api/regions/{id}/省-显示该地区的所有省
/api/省/{id}-显示一个省


我发现,每个请求只需要一个{id}。

在某种程度上,我完全支持您:

/api/状态-是,列出所有状态
/api/states/{id}-是,显示一个状态
/api/states/{id}/regions-是的,只是处于该状态的区域

但现在我要走这条路:

/api/regions/{id}-显示一个区域
/api/regions/{id}/省-显示该地区的所有省
/api/省/{id}-显示一个省

我发现,每个请求只需要一个{id}。

好吧(在查看数据库模式之后),我想您所有的
地区和
都已经有了唯一的标识符,您只需从
以外的所有资源中修剪
/api/states
。这与使用查询参数筛选特定ID的
省份
/
地区
的事实相结合

因此,将以以下端点结束

+----------------------------------------------+---------------------------------------------------------+
|                   Endpoint                   |                       Description                       |
+----------------------------------------------+---------------------------------------------------------+
| `/api/state`                                 | Get a list of States                                    |
| `/api/state/<id>`                            | Get a specific State                                    |
| `/api/region`                                | Get a list of regions                                   |
| `/api/region?state_id=<id>`                  | Get a list of regions from a specific state             |
| `/api/region/<id>`                           | Get a specific region                                   |
| `/api/province`                              | Get a list of provinces                                 |
| `/api/province?state_id=<id>&region_id=<id>` | Get a list of provinces based on state_id and region_id |
| `/api/province/<id>`                         | Get a specific Province                                 |
+----------------------------------------------+---------------------------------------------------------+
+----------------------------------------------+---------------------------------------------------------+
|端点描述|
+----------------------------------------------+---------------------------------------------------------+
|`/api/state`|获取状态列表|
|`/api/state/`|获取特定状态|
|`/api/region`|获取区域列表|
|`/api/region?state_id=`|从特定状态获取区域列表|
|`/api/region/`|获取特定区域|
|`/api/province`获取省份列表|
|`/api/province?state_id=®ion_id=``根据state_id和region_id获取省份列表|
|`/api/province/`|获取特定的省|
+----------------------------------------------+---------------------------------------------------------+
现在,随着这些路由/端点的布置,如何通过API实际创建这些资源也变得很明显。如果API的客户端知道资源的结果,则可以使用
POST
PUT

另外,请考虑@roman vottner在上面的评论中所说的话。

好吧(在查看数据库模式之后),我想您的
中的所有状态都是
地区
省份
已经有了唯一的标识符,您只需从除
以外的所有资源中修剪
/api/states
。这与使用查询参数筛选特定ID的
省份
/
地区
的事实相结合

因此,将以以下端点结束

+----------------------------------------------+---------------------------------------------------------+
|                   Endpoint                   |                       Description                       |
+----------------------------------------------+---------------------------------------------------------+
| `/api/state`                                 | Get a list of States                                    |
| `/api/state/<id>`                            | Get a specific State                                    |
| `/api/region`                                | Get a list of regions                                   |
| `/api/region?state_id=<id>`                  | Get a list of regions from a specific state             |
| `/api/region/<id>`                           | Get a specific region                                   |
| `/api/province`                              | Get a list of provinces                                 |
| `/api/province?state_id=<id>&region_id=<id>` | Get a list of provinces based on state_id and region_id |
| `/api/province/<id>`                         | Get a specific Province                                 |
+----------------------------------------------+---------------------------------------------------------+
+----------------------------------------------+---------------------------------------------------------+
|端点描述|
+----------------------------------------------+---------------------------------------------------------+
|`/api/state`|获取状态列表|
|`/api/state/`|获取特定状态|
|`/api/region`|获取区域列表|
|`/api/region?state_id=`|从特定状态获取区域列表|
|`/api/region/`|获取特定区域|
|`/api/province`获取省份列表|
|`/api/province?state_id=®ion_id=``根据state_id和region_id获取省份列表|
|`/api/province/`|获取特定的省|
+----------------------------------------------+---------------------------------------------------------+
现在,随着这些路由/端点的布置,如何通过API实际创建这些资源也变得很明显。如果API的客户端知道结果,则使用
POST
PUT