繁体   English   中英

RESTful API:我应该在哪里编写工作流程?

[英]RESTful API: Where should I code my workflow?

我正在开发RESTful API。 这是我的第一个API,也是我的第一个非常大的编码项目。 因此,我仍然在学习很多有关建筑等方面的知识。

目前,我在以下层中设置了api:

  • HTTP层
  • 资源层
  • 域模型/业务逻辑层
  • 数据访问/存储库层
  • 持久存储/数据库层

我目前遇到的问题是我需要在哪里放置工作流对象/经理? 按工作流程,我的意思是评估最终用户下一步所需的代码。 例如,电子商务工作流程。 用户将项目添加到购物篮,然后签出,然后填写个人详细信息,然后付款。 工作流程将负责决定接下来的步骤,以及不允许的步骤。 例如,用户不能通过在输入个人详细信息之前尝试付款来导致API中的错误(可能他们回想起付款的URI并尝试跳过一个步骤)。 工作流程将检查以前所有步骤是否已完成,如果没有,则不允许付款。

目前,我的工作流逻辑位于资源层中。 我正在使用超媒体链接向用户呈现工作流程,例如提供“下一步”链接。 我遇到的问题是资源层是顶级层,并且与表示更加一致。 我觉得需要对底层域模型有太多了解才能有效地评估工作流,即它需要知道它必须在允许付款之前检查personal_detail的实体。

这让我想到工作流属于域模型。 这确实更有意义,因为真正的工作流是业务逻辑的一部分,因此我认为最好放在域层中。 毕竟,用其他东西替换资源层,您仍然需要基础工作流。

但现在问题是工作流需要知道几个域对象才能完成其逻辑。 它现在感觉是对的,它可能会在自己的层中? 在资源和域层之间?

  • HTTP层
  • 资源层
  • 工作流层
  • 域模型/业务逻辑层
  • 数据访问/存储库层
  • 持久存储/数据库层

我只是想知道是否有人对此有任何其他意见或想法? 正如我所说,我没有过去的应用经验来了解应该放置工作流程的位置。 我真的只是第一次学习这个,所以想要确保我正确的方式。

我们将非常感谢您对文章或博客的链接。 喜欢阅读不同的实现。

编辑

为了澄清,我发布HATEOAS允许客户端浏览“工作流程”,但我的API中必须有一些知道要显示的链接,即它确实定义了允许的工作流程。 它在资源中显示与工作流相关的链接,但另外它验证请求与工作流同步。 虽然我同意客户可能只会遵循资源中提供的链接,但是休息的危险(和美)是它的URI驱动,所以没有什么可以阻止恶作剧客户试图通过以下方式“跳过”工作流程对URI进行有根据的猜测。 API需要发现这一点并返回302响应。

这个问题的答案让我得到了相当多的研究,但基本上“工作流程”部分与REST完全无关,而与应用层有关。

我的系统有应用程序逻辑和REST API太紧密耦合。 我通过重构来减少耦合来解决我的问题,现在工作流程仍然存在于应用程序的上下文中

REST鼓励您根据已建立的动词集(GET,POST,PUT,DELETE)创建名词词汇(用户,产品,购物车)。 如果您遵守此规则,那么在您的示例中,工作流实际上是由用户与您的站点进行的交互集定义的。 这是用户使用您的应用程序的方式,它实际上是由UI定义的。 您的REST服务应该对无效状态请求做出适当的反应,例如尝试使用空购物车结帐,但UI也可能使用脚本阻止此类请求,这是REST的可选特性。

例如,向用户显示产品的UI也可能显示允许用户将该产品添加到其购物车的链接(POST shoppingcart / {productId})。 服务器真的不应该关心用户如何进入该POST,只是它应该将该产品添加到用户的购物车并将更新的购物车表示返回给用户。 然后,UI可以使用javascript来确定仅在购物车具有一个或多个项目时是否显示要结账的链接。

因此,您的工作流似乎位于REST服务之外,而是由页面中的导航定义,这些导航在用户请求时与您的REST服务进行交互。 您当然可能拥有必须在应用程序中根据用户设置的状态进行的内部工作流程。 但您似乎在描述的是网站内的用户交互,虽然这确实是一个工作流程,但它似乎更好地由您的UI定义,而不是由专用的服务器端组件/层定义。

您可以触及API的工作流程(也称为业务逻辑)。 从技术上讲,这是API部分的一个独立问题,即API接口。 当然,正如你所提到的,HATEOAS允许你建议某些有效的行为,但你应该小心保持无国籍状态

在REST应用程序中,服务器端不得存储会话状态。 相反,它必须完全由客户端处理。

因此,如果服务器上存在会话状态,则不是REST。

对于购物车示例,您可以将状态保存在Redis等单独的缓存层中。 至于你的工作流程。 您不希望在域模型中计算购物车或总帐单等业务逻辑。 这将被添加到服务层。

你谈到了恶作剧用户猜测网址。 这始终是一个问题,应由您的安全人员处理。 如果删除用户的URL是DELETE /user/3782 ......他们可以轻松猜出如何删除所有用户。 但是你不应该只依赖于混淆URL。 您应该在端点内部进行真正的安全性和访问检查,检查每个请求是否有效。

这是针对您的购物车问题的相同解决方案您需要授予一个令牌,该令牌将附加他们的购物信息并使用它来验证每个操作,无论他们是否知道正确的URL。 在安全方面没有捷径可走。

您可能希望按照DDD(域驱动设计)的方式重新定位您的架构,并且可能使用MSA,这样您就可以从编排的工作流转换到EDA和微过程的编排。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM