在过去的几年里,我一直需要在一种更大的服务类型中实现业务逻辑,最常见的是安排少量原子/微服务。
例如“搜索和更新文档,然后给人力资源团队发电子邮件”,“签署合同和更新ERP",”开始ERP批处理工作“。
但是,将这些复合服务映射到RESTful结构总是感觉很奇怪。处理这些实现的一些常见方法是什么?
我不是在问这个逻辑应该放在哪里(中间件还是其他地方),而是应该如何构造REST端点。在上面提供的例子中,什么才是构成资源的?用什么动词?
/updatedocument和POST?
/erp/batch/start和PUT?
发布于 2016-03-20 05:46:27
多年来,我创造了许多超媒体服务,我感受到了这种痛苦。归根结底是从长远的角度出发。所以,我会尽我最大的努力来描述我的经历。
乍一看,REST被天真地描述为通过使用创建、更新、检索和删除资源来遵守体系结构约束。许多人将此等同于将CRUD对象持久化到数据库中。尽管有很大一部分的微服务可以做到这一点,但它通常是贫血的,否则提供的功能就不多了。
那么,资源到底是什么呢?对我来说,资源还提供功能和过程的抽象。资源的表示是指显示该功能或进程状态的数据。
让我们以您的"ERP批处理“为例。这显然是一个复杂的过程,可能涉及多个内部服务。有很可能是与这种活动相关的东西。这些相关数据是批处理资源。这是一个批次的状态。为了满足REST超媒体约束,我们通过创建一个POST来创建一个新的批处理资源:
POST /erp/batch我使用POST而不是PUT,因为我们正在创建一个新的资源,并且不知道资源的确切URL。帖子不是幂等的。每次调用都会创建一个新的、唯一的资源。还请注意,URL是单数名词,而不是以动词结尾。
我们正在创建的资源是一个概念性的批处理过程。这个POST操作应该存储初始状态,异步启动流程工作流,并在Location头中返回资源的URL。工作流过程不需要在返回URL之前完成,应该定期更新资源数据。这取决于您的内部架构。它可以是直接的,事件驱动的,或者其他什么的。
反过来,客户端可以使用该URL检索批处理资源,其中表示是批处理过程的当前状态(例如:
GET /erp/batch/917163随着流程通过其工作流,批处理的表示形式将发生变化。批处理的状态、可能发生的任何错误或警告以及最终结果。事实上,资源数据的变化,您的客户将需要知道。这是使用缓存头和条件GET请求的地方。
这两个操作可能是您所需的最低要求。但如果你想取消一批呢?我们怎样才能做到RESTfully呢?这需要很多思考。我看到了许多选择:
我喜欢做一个取消资源:
PUT /erp/batch/917163/cancellation如果服务遵循超媒体约束,客户端可以通过跟踪批处理资源中的链接来发现取消的能力。我使用PUT方法,因为我知道这个取消的URL,并且可能只接受一个取消。我本可以轻松地发布一个帖子,以支持多个唯一可跟踪的取消请求:
POST /erp/batch/917163/cancellation与批处理一样,它还将创建一个新的URL。取消表示可以返回到批处理。可能性是无限的。
我希望这能给你一个新的视角。祝好运。
https://softwareengineering.stackexchange.com/questions/313221
复制相似问题