RESTful 端点太长可以吗?

Is it OK to have too long RESTful endpoint?

我的服务有3种模型类,分别是UserProjectSimulation

问题是 Project 由 6 个级别组成。

User > Proejct(lv1) > Project(lv2) > Project(lv3) > Project(lv4) > Project(lv5) > Project(lv6) > Simulation

我根据层次结构做了一个RESTful端点URL,
最后的结果是这样的。

http://MY_SERVER.com/rest/project/team-members/{userId}/divisions/{divisionId}/products/{productId}/bgatypes/{bgaTypeId}/devices/{deviceId}/ballcounts/{ballCountId}/pkgsizes/{pkgSizeId}/simulations

我想知道我是否在做错误的 RESTful 协议设计,因为 URL 变得太长了。

使用查询参数而不是路径变量更好吗?
任何建议将不胜感激。

+另一个想法

我正在考虑更改以使其更短,这是我的想法。
由于每个结果只有一个父级,我想只给一个参数 parentId 来查询它们,所以它看起来像这样。

http://MY_SERVER.com/rest/project/team-members
http://MY_SERVER.com/rest/project/divisions?userId=user1
http://MY_SERVER.com/rest/project/products?divisionId=division32
http://MY_SERVER.com/rest/project/bgatypes?productId=product402
http://MY_SERVER.com/rest/project/devices?bgaTypeId=bgatype777
http://MY_SERVER.com/rest/project/ballcounts?deviceId=device139
http://MY_SERVER.com/rest/project/pkgsizes?ballCountId=ballcount587
http://MY_SERVER.com/rest/project/simulations?pkgSizeId=pkgsize591

这是否违反 RESTful 协议?哪个更好?

这取决于您在项目中所说的 levels 是什么意思。在 REST 中,每个资源(例如数据库的模型 table、entity)都应该是一个路径变量。这将被定义为 /resource/{resourceId}。如果你有一个子资源,比如说 User 有一个 Project,那么你就会有 /user/{userId}/project/{projectId}

如果级别是 Project 的属性,那么您可能需要使用查询参数。您必须更清楚地了解什么级别以及您究竟想要完成什么。