我遇到了REST命名约定和后端端点放置的问题。让我们假设我们的系统具有以下域名对象:产品和调查。每个产品都附有一些调查。调查是一种表格,其中包含用户在评价产品时填写的问题。我想进行像'获得具有特定ID的产品的调查'这样的操作。我认为可能的终点是:
更合乎逻辑和自然是第二种选择。但现在问题在于控制器。我们有ProductController和SurveyController。 ProductController由根URI /产品映射,SurveyController与/ survey URI映射。因此,以/ product开头的每个方法都应放在ProductController中,与/ survey相同。 如果我们选择第二个选项,那么我们应该在ProductController中提供具体的方法来获取产品的调查。但是,ProductController为Survey提供服务可能令人困惑。它应该在Product上运行。开发人员更自然的方式是SurveyController返回Survey。 ProductController使用SurveyService并不重要,例如获得具体产品的调查。我们总是可以在SurveyController中使用映射,其中我们放置了返回具体产品调查的方法,并通过URI / product / {id} / survey进行映射,但这对于开发人员查找方法声明而言也是一件令人困惑和耗时的事情,我们无法注释控制器使用一些根URI路径。
什么更好?要使用以例如以...开头的URI的严格约定。 / product总是分配有ProductController,开发人员可以通过URI快速查找方法,但是方法可以服务于不同的域对象,不仅是产品,还是使用不同的URI和不同控制器之间的根路径?
如果我们有很少的控制器和很少的域对象,问题看起来很简单。但是当我们考虑使用大约100个域对象的系统时呢?
答案 0 :(得分:0)
对于100个域对象,通常有一种用于定向的结构。这意味着一个依赖图,它有点决定如何分割域,甚至分成单独的项目,或单独的可运行的应用程序(微服务)。因此,更大的模型实际上更“容易”。
我可能会考虑哪种资源是我模型的核心。例如,如果Product
可能在没有调查的情况下存在,但如果没有Survey
Product
没有意义,我可能会media-type
Survey
链接到Product
,而不是其他方式。这可能看起来像:
/survey/123 <-- contains link to /product/456
在实践中,这意味着您不必像您提议的那样实际提供“子资源”。