将RESTful资源映射到现有域的最佳实践

将RESTful资源映射到现有域的最佳实践,rest,dns,Rest,Dns,我们将要创建一些RESTful服务,这些服务本质上是一些老式的基于SOAP的Web服务的传递。SOAP服务更加通用,将在我们整个组织中使用(至少这是计划)。RESTful服务是针对特定客户机定制的。这个决定已经做出,不幸的是我无法控制改变 我们正在努力以一种合理的方式构造RESTful资源,遵循REST最佳实践,并调用这些SOAP服务而不给自己带来太多痛苦 我们在后端服务的粒度级别上有一定的自由度,但普遍的共识是:保持它们的粗粒度,而不是根据特定客户的需求来定制它们 这导致了一些有趣的问题。例如

我们将要创建一些RESTful服务,这些服务本质上是一些老式的基于SOAP的Web服务的传递。SOAP服务更加通用,将在我们整个组织中使用(至少这是计划)。RESTful服务是针对特定客户机定制的。这个决定已经做出,不幸的是我无法控制改变

我们正在努力以一种合理的方式构造RESTful资源,遵循REST最佳实践,并调用这些SOAP服务而不给自己带来太多痛苦

我们在后端服务的粒度级别上有一定的自由度,但普遍的共识是:保持它们的粗粒度,而不是根据特定客户的需求来定制它们

这导致了一些有趣的问题。例如,如何处理父级的子资源。我们一直在处理的典型示例是:一个拥有子地址的客户

我们有一个后端SOAP服务,它将客户作为一个整体进行更新。但是,REST服务客户端可能只需要更新账单地址。我们如何最好地处理子资源的后续更新

我们应该在“父”级别(客户)进行更新,还是公开一个更细粒度的REST操作,将地址作为资源进行更新?后者似乎是正确的、宁静的方式。但是,如果我们这样做,我们将本质上调用一个粗粒度的后端服务,只需要更新的一部分。这似乎没有什么意义,因为这是一个相当重要的决定

我们还在努力研究如何将RESTful资源与后端域模型关联起来。我们可能关心RESTful资源作为单个实体,但在后端的域中,它可能是许多不同的实体。我们现在有一个相对简单的DB表来处理这个问题,但我不相信它会随着我们将越来越多的资源映射到域对象而扩展

这些只是我们遇到的几个例子。。。我想知道是否有人遇到过类似的问题,有什么建议,或者可以给我指一些可能有一些最佳实践的文章

这似乎不是一个不寻常的问题,随着越来越多的应用程序使用RESTful架构,这一问题将变得更加重要,但我似乎找不到关于它的任何其他信息


多谢

我发现我建模的大多数域都很容易映射到REST。最重要的是要进入正确的心态。REST将域建模为一组资源,其中SOAP倾向于强调一组操作。看待这一点的另一种方式是REST关注状态,SOAP关注状态转换。更简单的是,您可以将REST视为名词,而将SOAP视为动词。我知道这不是一个完美的类比,但它对我很有用

当你进入这种思维状态时,映射应该几乎是自动的。让我们看看您的客户地址交互

我不认为仅仅为了更新地址而更新整个客户是不合适的,但是不熟悉你的域,也许是这样。如果您想具体地与地址交互,只需创建一个子资源(或嵌套资源)。最后,您将得到url和谓词的以下映射:

GET /customer/72/address    # return the address of customer with id 72
PUT /customer/72/address    # update the address of customer with id 72
在这种特殊情况下,映射删除、创建或列出操作可能没有意义

如果您的客户有一些实体的集合,比如小部件,您可以这样映射交互:

GET     /customer/72/widgets        # return the widgets of customer with id 72
POST    /customer/72/widgets        # create a new widget for customer with id 72
GET     /customer/72/widgets/158    # return widget with id 158 of customer 72
PUT     /customer/72/widgets/158    # update widget with id 158 of customer 72
DELETE  /customer/72/widgets/158    # delete widget with id 158 of customer 72

只要有正确的心态,记住映射不会是一对一的,你会没事的。

不要尝试将域实体建模为资源。将视图/用例建模为资源。为特定客户构建资源绝对没有错。REST鼓励意外重复使用,即意外重复使用,但它并不建议您尝试构建适用于所有可能场景的资源

RESTful框架应该使资源真正便宜,并且可以快速创建。如果您需要五种不同的资源来对访问客户的所有方式进行建模,那么这很好


一般来说,我更喜欢使用粗粒度资源,因为这正是HTTP优化的目的

有益的回应,让我对我们倾向于做的事情感到更舒服一点。不过,我仍然想知道域模型之间的相关性。这似乎是一个常见的问题!如果你遇到过,请告诉我。事实上,我现在从事的项目主要是基于将许多类似的域模型映射到单个主域。我发现映射本身是一个基本的复杂性,您不能用特定的约定或协议来设计它。因为您用两种形式表示相同的基础域,所以它们在概念上应该是等价的,并且您应该对映射没有问题。