首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实现复合REST服务

实现复合REST服务
EN

Software Engineering用户
提问于 2016-03-19 11:20:22
回答 1查看 1.4K关注 0票数 7

在过去的几年里,我一直需要在一种更大的服务类型中实现业务逻辑,最常见的是安排少量原子/微服务。

例如“搜索和更新文档,然后给人力资源团队发电子邮件”,“签署合同和更新ERP",”开始ERP批处理工作“。

但是,将这些复合服务映射到RESTful结构总是感觉很奇怪。处理这些实现的一些常见方法是什么?

我不是在问这个逻辑应该放在哪里(中间件还是其他地方),而是应该如何构造REST端点。在上面提供的例子中,什么才是构成资源的?用什么动词?

/updatedocumentPOST

/erp/batch/startPUT

EN

回答 1

Software Engineering用户

回答已采纳

发布于 2016-03-20 05:46:27

多年来,我创造了许多超媒体服务,我感受到了这种痛苦。归根结底是从长远的角度出发。所以,我会尽我最大的努力来描述我的经历。

乍一看,REST被天真地描述为通过使用创建、更新、检索和删除资源来遵守体系结构约束。许多人将此等同于将CRUD对象持久化到数据库中。尽管有很大一部分的微服务可以做到这一点,但它通常是贫血的,否则提供的功能就不多了。

那么,资源到底是什么呢?对我来说,资源还提供功能和过程的抽象。资源的表示是指显示该功能或进程状态的数据。

让我们以您的"ERP批处理“为例。这显然是一个复杂的过程,可能涉及多个内部服务。有很可能是与这种活动相关的东西。这些相关数据是批处理资源。这是一个批次的状态。为了满足REST超媒体约束,我们通过创建一个POST来创建一个新的批处理资源:

代码语言:javascript
复制
POST /erp/batch

我使用POST而不是PUT,因为我们正在创建一个新的资源,并且不知道资源的确切URL。帖子不是幂等的。每次调用都会创建一个新的、唯一的资源。还请注意,URL是单数名词,而不是以动词结尾。

我们正在创建的资源是一个概念性的批处理过程。这个POST操作应该存储初始状态,异步启动流程工作流,并在Location头中返回资源的URL。工作流过程不需要在返回URL之前完成,应该定期更新资源数据。这取决于您的内部架构。它可以是直接的,事件驱动的,或者其他什么的。

反过来,客户端可以使用该URL检索批处理资源,其中表示是批处理过程的当前状态(例如:

代码语言:javascript
复制
GET /erp/batch/917163

随着流程通过其工作流,批处理的表示形式将发生变化。批处理的状态、可能发生的任何错误或警告以及最终结果。事实上,资源数据的变化,您的客户将需要知道。这是使用缓存头和条件GET请求的地方。

这两个操作可能是您所需的最低要求。但如果你想取消一批呢?我们怎样才能做到RESTfully呢?这需要很多思考。我看到了许多选择:

  • 一些服务将“取消”标志公开为资源表示的一部分,并使用PUT操作。但是,PUT操作通过让客户端传递该资源的新表示来更新整个资源。这是可以的,如果表示是小的,低风险,但它可以允许客户端破坏您的批处理过程。
  • 代替PUT,有些人使用修补程序(一个WebDAV HTTP扩展)对资源进行部分更新,并设置此"cancel“标志。再说一遍,感觉不到RESTful。
  • 有些人使用DELETE来充当取消的角色。删除意味着我们正在删除该资源。这里的问题是,对DELETEd资源的URL执行GET应该会返回400个级别的错误,但是仍然需要相关数据。这感觉更像是一次赤角行动。

我喜欢做一个取消资源:

代码语言:javascript
复制
PUT /erp/batch/917163/cancellation

如果服务遵循超媒体约束,客户端可以通过跟踪批处理资源中的链接来发现取消的能力。我使用PUT方法,因为我知道这个取消的URL,并且可能只接受一个取消。我本可以轻松地发布一个帖子,以支持多个唯一可跟踪的取消请求:

代码语言:javascript
复制
POST /erp/batch/917163/cancellation

与批处理一样,它还将创建一个新的URL。取消表示可以返回到批处理。可能性是无限的。

我希望这能给你一个新的视角。祝好运。

票数 6
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/313221

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档