首页 > 解决方案 > RESTful 端点过长可以吗?

问题描述

我的服务有 3 种模型类,它们是User, Project, Simulation.

问题是Projects 由 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 协议?哪个更好?

标签: restspring-bootdesign-patternscontrollerrestful-url

解决方案


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

如果级别是 a 的属性Project,那么您可能需要使用查询参数。您必须更多地阐明什么级别以及您到底想要完成什么。


推荐阅读